【RuoYi】实现文件的上传与下载

一、前言

   首先,最近在做一个管理系统,里面刚好需要用到echarts图和富文本编辑器,然后我自己去看了官网觉得有点不好懂,于是去B站看来很多视频,然后看到了up主【程序员青戈】的视频,看了他讲的echarts图和富文本编辑器部分的内容,觉得讲的很好,很推荐大家去观看他的视频。然后在富文本编辑器这部分内容中,需要用到,文件上传与下载的部分知识,所以这里做一个笔记,来记录关于这部得分的内容,echarts图和富文本编辑器部分的内容也会在后面的博客中介绍。希望对大家有所帮助啦~

二、准备工作

   导入hutool的依赖

        <!--hutool工具类-->
        <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.25</version>
        </dependency>

三、文件上传与下载代码

   如下所示,是跟着青戈学的已经封装好的代码,大家可以直接拿来用。但是需要注意的是,我用的是RuoYi的框架,所以最后返回的是RuoYi封装好的AjaxResult结果集,而不是青戈自己写的Result结果集,就这里需要注意以下。

@RestController
@Api(tags = "文件上传与下载模块")
@RequestMapping("/file")
public class FileController extends BaseController {
    @Value("${ip:localhost}")
    String ip;//通过配置文件拿到ip

    @Value("${server.port}")
    String port;

    private static final String ROOT_PATH = System.getProperty("user.dir")+ File.separator+"files";//文件根目录
    @ApiOperation(value = "文件上传")
    @PostMapping("/upload")
    public AjaxResult Upload(@RequestPart("file") MultipartFile file) throws IOException {//MultipartFile file 输入的文件
        String originalFilename = file.getOriginalFilename();//originalFilename是获取源文件名
        String mainName = FileUtil.mainName(originalFilename);// mainName 是主文件名
        String extName = FileUtil.extName(originalFilename);//extName 是文件的标识 png、pdf等
        if(!FileUtil.exist(ROOT_PATH)){//通过hutool工具类中的FileUtil来判断我们的根目录是否存在,若不存在则在根目录下创建file文件夹
            FileUtil.mkdir(ROOT_PATH);
        }
        //判断file文件夹中传入的文件是否存在,若存在为了防止重名不被替换,则需要对文件重新命名
        if(FileUtil.exist(ROOT_PATH+File.separator+originalFilename)){
            originalFilename=System.currentTimeMillis()+"_"+mainName+"."+extName;
        }
        File saveFile = new File(ROOT_PATH + File.separator + originalFilename);//创建一个file文件对象,方便写入磁盘
        file.transferTo(saveFile);//存储文件到本地磁盘里面去
        String url ="http://"+ip+":"+port+"/file/download/"+originalFilename;//问价下载的路径
        return AjaxResult.success(url);//RuoYi自带的结果集
    }


    @ApiOperation(value = "文件下载")
    @GetMapping("/download/{fileName}")
    public void download(@PathVariable String fileName, HttpServletResponse response) throws IOException {
//        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));//文件下载
        response.addHeader("Content-Disposition", "inline;filename=" + URLEncoder.encode(fileName,"UTF-8"));//文件预览
        String filePath = ROOT_PATH+File.separator+fileName;//拿到文件的路径
        if(!FileUtil.exist(filePath)){//文件不存在,就不用管,因为没有东西可写
            return;
        }
        byte[] bytes = FileUtil.readBytes(filePath);//使用FileUtil从filePath中去读取文件
        ServletOutputStream outputStream = response.getOutputStream();
        outputStream.write(bytes);//把文件的字节数写出去
        outputStream.flush();//刷新一下
        outputStream.close();//一定要关闭文件流
    }
}

接口测试

我们在测试接口时,可以直接使用RuoYi框架为我们提供的Swagger来测试接口,当然也可以用PostMan,看个人的习惯来定了。

bbe54ea0ff974437a3f132f5fe6e4682.png

a6711e0d31e147cba7d4d9d88e5f4805.png

8a7c4224decc43f6beff175d7cbf0dc1.png

文件上传成功返回码为200,而且在Idea中生成file文件夹

1242212e892b4a4c9a311d464e4791e0.png

57a9f1faf2304ae78ca45bd3552d37e3.png

到此我们的文件上传与下载的接口就完成了,接下来我们来看看如何在前端使用我们的该功能。

四、实践

①单文件上传

da561baecfeb49de9762768906024a99.png

如上图所示,我们现在要完成一个点击功能,从而实现用户头像的上传与显示,这个功能也是我们在做项目中很常见的功能。

思路:上传图片->保存数据库->再从数据库拿到图片路径

先完成文件的上传:

05f047e215dc457885107c79fd926ed3.png

注意:我们使用的是RuoYi框架中的AjaxResult结果集,返回的数据是在response下的msg中

bf68590f7fa04edfa67326fb10bbb101.png

JS中代码

    handleTableFileUpload(row,file,fileList){
      console.log(row,file)
      row.stuAvatar=file.response.msg//注意我们使用的是RuoYi框架中的AjaxResult结果集,返回的数据是在response下的msg中
      //触发更新
      //使用RuoYi中封装好的updateStudent()函数,将当前对象更新
      updateStudent(row).then(response => {
        if(response.code=='200'){
          this.$message.success("上传成功")
        }else{
          this.$message.success("上传失败")
        }
        this.form = response.data;
      });
    }

头像显示代码:

7cd6da79d60a4fc694edec61a9fa41d0.png

效果如下:

8fa802193bf14a8e9bcc4058517616ad.png

②多文件上传

多文件其实是基于单文件的,就是在单文件的基础上,多次请求即可。我们也可以做个简单的案例测试。先在element-ui随便找一个文件上传的前端页面,如下图所示:

b15d1a2133634dcc904d108af8057a05.png

放在我们的RuoYi的项目中:

2a01bafe498047b691df4e098c9116ee.png

400e8f62200e4730ad4d25a0ffc7bcc0.png

12b6eeabdec94234bd1b3455f7c98009.png

测试:

74b57ed4df6f43ed9b7d584848596aff.png

a4c3d68d69704cc4aed5f279629a5995.png

如上图所示,我们可以成功的拿到三张图片的地址,此时我们只需要,将其存入数据库,再从数据库中拿出来显示即可,大家下来试一试即可,我这里就不做测试了。

五、总结

   跟着青戈学习了这个文件上传与下载的的视频,自己真的学到了很多,这个文件上传下载的功能不仅适用于图片,也可以用在pdf、word等文件中,也希望这些内可以帮助屏幕前的小伙伴们,如果有所帮助,别忘了点赞、关注一波哦~

 

  • 22
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值