前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MultipartFile重命名上传

MultipartFile重命名上传

作者头像
Li_XiaoJin
发布2022-06-10 21:35:18
2.8K0
发布2022-06-10 21:35:18
举报
文章被收录于专栏:Lixj's BlogLixj's Blog

工具类。

之前的 使用HttpClient通过Post请求发送MultipartFile文件 做了上传的功能,今天发现文件同名时会被覆盖,决定在上传前修改文件名。记录做个工具类。。。。

被做个文件上传搞死,问题一个接一个。。。

代码语言:javascript
复制

    private MultipartFile renameFile(MultipartFile multipartFile) throws Exception {

        InputStream inputStream = null;
        try {
            
            String originalFilename = multipartFile.getOriginalFilename();
            if (StringUtil.isEmpty(originalFilename)) {
                throw new BizException(CosmosResultCodeEnum.BIZ_FAIL);
            }
            String prefix = originalFilename.substring(0, originalFilename.lastIndexOf("."));
            prefix = prefix.length() < 3 ? prefix + "_file" : prefix;
            String suffix = getSuffix(multipartFile);
            // 临时文件
            File file = File.createTempFile(prefix, "." + suffix);
            multipartFile.transferTo(file);
            String fileName = prefix + "_" + UUIDUtil.getTimeStamp() + "." + suffix;
            // 重命名
            file = FileUtil.rename(file, fileName, true, true);
            inputStream = new FileInputStream(file);
            // File转换成MultipartFile
            multipartFile = new MockMultipartFile(fileName, fileName,
                    ContentType.APPLICATION_OCTET_STREAM.toString(), inputStream);

            if (!file.delete()) {
                throw new BizException(CosmosResultCodeEnum.BIZ_FAIL);
            }

            return multipartFile;
        } catch (Exception e) {
            throw new BizException(CosmosResultCodeEnum.BIZ_FAIL);
        } finally {

            if (inputStream != null) {
                inputStream.close();
            }
        }

    }

2021-7-4 更新

上周发现生成 MultipartFile 时 ContentType 指定为 application/octet-stream ,文件上传后,前端通过链接不能直接进行下载,比如访问 doc 文件,浏览器展示的是 xml(如下图)。访问链接时发现 ContentType 为 text/xml,经过一番验证,发现将 ContentType 改为 multipart/form-data 就能进行下载了。

代码语言:javascript
复制
MultipartFile multipartFile = new MockMultipartFile(fileName, fileName, "multipart/form-data", inputStream);

因为业务需要改为 multipart/form-data 了,有些场景可以用 application/octet-stream,比如上传的是图片,用 application/octet-stream 上传的会保留原文件的类型,上传后访问链接时可以进行预览而不是直接下载,而如果使用的是 multipart/form-data 了,上传后访问链接就是直接下载了。

当然了,这些只是浏览器的默认处理,我们也可以交给前端处理,如果处理不了,可以考虑在 Nginx 那里做代理。交给前端处理就比较灵活一些。

End.

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可 Links: https://lixj.fun/archives/multipartfile重命名上传

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-06-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档