• 【SpringBoot+Vue】前后端分离项目之图片上传与下载


    一、图片上传

    前端:

    1. <template>
    2. <el-upload
    3. class="avatar-uploader"
    4. action="http://localhost:8080/common/upload"
    5. :show-file-list="false"
    6. :on-success="handleAvatarSuccess"
    7. :before-upload="beforeAvatarUpload"
    8. ref="upload">
    9. <img v-if="imageUrl" :src="imageUrl" class="avatar">
    10. <i v-else class="el-icon-plus avatar-uploader-icon">i>
    11. el-upload>
    12. template>
    13. <script>
    14. export default{
    15. data(){
    16. return{
    17. imageUrl:''
    18. }
    19. },
    20. methods:{
    21. handleAvatarSuccess (resp) {
    22. //这里的路径要配合上后端的Controller
    23. this.imageUrl = `http://localhost:8080/common/download?name=${resp}`
    24. },
    25. beforeAvatarUpload(file) {
    26. const isPNG = file.type === 'image/png';
    27. const isLt2M = file.size / 1024 / 1024 < 2;
    28. if (!isPNG) {
    29. this.$message.error('上传头像图片只能是 PNG 格式!');
    30. }
    31. if (!isLt2M) {
    32. this.$message.error('上传头像图片大小不能超过 2MB!');
    33. }
    34. return isPNG && isLt2M;
    35. }
    36. }
    37. }
    38. script>
    39. <style>
    40. .avatar-uploader .el-upload {
    41. border: dashed 2px #d8dde3 !important;
    42. border-radius: 4px !important;
    43. background: #fcfcfc;
    44. }
    45. .avatar-uploader .avatar-uploader-icon {
    46. background: #fcfcfc;
    47. }
    48. .avatar-uploader .el-icon-plus:before {
    49. content: "上传图片" !important;
    50. font-size: 12px;
    51. color: #000;
    52. }
    53. style>

    后端:

    1. @RestController
    2. @RequestMapping("/common")
    3. public class FileController {
    4. @Value("${hong.path}")
    5. private String basePath;
    6. @PostMapping("/upload")
    7. public String upload(MultipartFile file){
    8. //原始文件名
    9. String originalFilename = file.getOriginalFilename();//xxx.png
    10. //对原始名进行截取"."后面的字符
    11. String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));//.png
    12. //使用UUID重新生成文件名,防止文件名称重复造成文件覆盖
    13. String fileName = UUID.randomUUID().toString() + suffix;
    14. //创建一个目录对象
    15. File dir = new File(basePath);
    16. //判断当前目录是否存在:目录不存在,需要创建
    17. if(!dir.exists()) dir.mkdirs();
    18. try {
    19. //将临时文件转存到指定位置
    20. file.transferTo(new File(basePath + fileName));
    21. } catch (IOException e) {
    22. e.printStackTrace();
    23. }
    24. return fileName;
    25. }
    26. }
    1. 在yml中配置路径如下(可自行修改):
    2. hong:
    3. path : C:\images\

    二、图片显示/下载

    前端:

    1. <template>
    2. <el-table-column prop="image" label="图片" width="180" align="center">
    3. <template slot-scope="{ row }">
    4. <el-image
    5. style="height:80"
    6. :src="getImgUrl(row.image)"
    7. >
    8. el-image>
    9. template>
    10. el-table-column>
    11. template>
    12. <script>
    13. export default{
    14. methods:{
    15. getImgUrl(img) {
    16. //这里的路径注意自己的后端Controller路径
    17. return `http://localhost:8080/common/download?name=${img}`
    18. }
    19. }
    20. }
    21. script>
    22. <style>
    23. style>

    后端:

    1. @GetMapping("/download")
    2. public void download(String name, HttpServletResponse response){
    3. try {
    4. //输入流,通过输入流读取文件内容
    5. FileInputStream fileInputStream = new FileInputStream(new File(basePath + name));
    6. //输出流,通过输出流将文件写回浏览器
    7. ServletOutputStream outputStream = response.getOutputStream();
    8. response.setContentType("image/png");
    9. int len = 0;
    10. byte[] bytes = new byte[1024];
    11. while ((len = fileInputStream.read(bytes)) != -1){
    12. outputStream.write(bytes,0,len);
    13. }
    14. outputStream.flush();
    15. } catch (Exception e) {
    16. e.printStackTrace();
    17. } finally {
    18. if(fileInputStream != null){
    19. try {
    20. fileInputStream.close();
    21. } catch (IOException e) {
    22. e.printStackTrace();
    23. }
    24. }
    25. if(outputStream != null){
    26. try {
    27. outputStream.close();
    28. } catch (IOException e) {
    29. e.printStackTrace();
    30. }
    31. }
    32. }
    33. }

  • 相关阅读:
    java 随机数
    【POJ No. 3253】 围栏修复 Fence Repair
    作用域,基本数据类型(常量const),转义字符,单引号与双引号,运算符
    webassembly003 ggml GGML Tensor Library part-4 实现在浏览器端训练神经网络
    git花样百出的疑难点——记住这些疑难点可以帮你更加深刻的理解git相关命令
    ChatGPT AIGC Python实现自动切换年份进行动态图表可视化
    JAVAEE初阶相关内容第十四弹--网络初识
    D1117内置热保护和电流限制保护功能,输出电流能力为 1.0A,应用于计算机主板和显卡电源管理等产品上
    代码随想录53——动态规划:1143最长公共子序列、1035不相交的线、53最大子序和
    湾区新势力 智创大未来,数说故事大湾区总部一周年暨琴澳战略发布会成功举办
  • 原文地址:https://blog.csdn.net/m0_65563175/article/details/127981600