• 图像上传功能实现


    一、后端

    文件存放在images.path路径下

    1. package com.like.common;
    2. import jakarta.servlet.ServletOutputStream;
    3. import jakarta.servlet.http.HttpServletResponse;
    4. import org.springframework.beans.factory.annotation.Value;
    5. import org.springframework.web.bind.annotation.*;
    6. import org.springframework.web.multipart.MultipartFile;
    7. import java.io.File;
    8. import java.io.FileInputStream;
    9. import java.io.FileNotFoundException;
    10. import java.io.IOException;
    11. import java.util.UUID;
    12. /**
    13. * 本地文件上传下载
    14. */
    15. @RestController
    16. @RequestMapping("/common")
    17. @CrossOrigin
    18. public class CommonController {
    19. @Value("${images.path}")
    20. private String basePath;
    21. /**
    22. * 文件上传
    23. * @param file
    24. * @return
    25. */
    26. @PostMapping("/upload")
    27. public CommonDto<String> upload(MultipartFile file){
    28. //原始文件名
    29. String originalFilename = file.getOriginalFilename();
    30. String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
    31. //使用UUID重新生成一个文件名,防止文件名重复,造成文件覆盖
    32. String fileName = UUID.randomUUID().toString() + suffix;
    33. //创建一个目录
    34. File dir = new File(basePath);
    35. //判断当前目录是否存在
    36. if(!dir.exists()){
    37. //如果目录不存在就直接创建
    38. dir.mkdirs();
    39. }
    40. try {
    41. //将临时文件转存到指定位置
    42. file.transferTo(new File(basePath + fileName));
    43. } catch (IOException e) {
    44. e.printStackTrace();
    45. }
    46. CommonDto<String> commonDto = new CommonDto<>();
    47. commonDto.setContent(fileName);
    48. return commonDto;
    49. }
    50. /**
    51. * 文件下载接口
    52. */
    53. @GetMapping("/download")
    54. public void download(String name, HttpServletResponse response){
    55. try {
    56. //输入流,通过输入流读取文件内容
    57. FileInputStream fileInputStream = new FileInputStream(new File(basePath + name));
    58. //输出流 通过输出流将文件返回给浏览器,在浏览器中展示图片
    59. ServletOutputStream outputStream = response.getOutputStream();
    60. response.setContentType("/image/jpeg");
    61. int len = 0;
    62. byte[] bytes = new byte[1024];
    63. while((len = fileInputStream.read(bytes))!=-1){
    64. outputStream.write(bytes,0,len);
    65. outputStream.flush();
    66. }
    67. //关闭资源
    68. outputStream.close();
    69. fileInputStream.close();
    70. } catch (Exception e) {
    71. e.printStackTrace();
    72. }
    73. }
    74. }

    二、前端

    表格元素里面添加如下代码

    1. <el-table-column label="头像">
    2. <template slot-scope="scope">
    3. <el-popover
    4. placement="top-start"
    5. trigger="hover">
    6. <img :src="scope.row.avatar" style="width: 150px; height: 150px;">
    7. <img :src="scope.row.avatar" slot="reference" style="width: 50px; height: 50px;">
    8. </el-popover>
    9. </template>
    10. </el-table-column>

    新增和修改表单里添加如下代码

    1. <!-- 头像-->
    2. <el-form-item label="头像" :label-width="formLabelWidth" prop="avatar">
    3. <el-upload
    4. class="avatar-uploader"
    5. action="http://localhost:3333/common/upload?module=avatar"
    6. :show-file-list="false"
    7. :on-success="handleAvatarSuccess">
    8. <img v-if="form.avatar" :src="form.avatar" class="avatar">
    9. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
    10. </el-upload>
    11. </el-form-item>

    methods里写handleAvatarSuccess逻辑

    1. handleAvatarSuccess(res, file) {
    2. this.form.avatar = `http://localhost:3333/common/download?name=${res.content}`
    3. //手动触发一头像字段的校验
    4. this.$refs.foreName.validateField('avatar');
    5. //强制刷新
    6. this.$forceUpdate();
    7. },

    三、效果如下

    至此整个项目的开发工作全部完结

  • 相关阅读:
    『现学现忘』Git基础 — 20、Git中忽略文件补充
    C# 预处理器指令详解与示例
    谷粒商城----rabbitmq
    示例:python环境下字典和列表重组的一个小例子
    华为机试 - 冠亚军排名
    Jenkins+Docker+SpringCloud微服务持续集成(下)
    每天坚持写java锻炼能力---第一天(6.4)
    床旁婴儿床上架亚马逊美国站 ASTM F2906测试的重要性
    nodejs+vue城市轨道交通线路查询系统-计算机毕业设计
    【软件测试】坚持才有骄傲的资格,8年测试老鸟给我的忠告......
  • 原文地址:https://blog.csdn.net/m0_63732435/article/details/133578831