MutipartFile使用过程中遇到的坑

MutipartFile使用过程中遇到的坑

MutipartFilespring里面定义的接口,它封装了用户在上传图片时所包含的所有信息,但是有些时候我们要将file转换成MutipartFile,才能在保持原有代码逻辑的情况下方便代码的调整,但是file不能直接转换成MutipartFile,现在就要教大家如何将file转换成MutipartFile

接口地址:

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/mock/web/MockMultipartFile.html

 

使用postman测图片上传接口注意事项

1.1 在headers 请求头中不需要传入参数

1.2 body中选择form-data类型

后台代码请求示例

1.     controller层中代码如下,非常简单, 多张图片上传的话直接List<MultipartFile>

直接传入一个list就好了。

@RequestMapping(value = {"uploadLicensePhoto"})
@ResponseBody
public
ResponseMessage uploadLicensePhoto(@RequestParam("file") List<MultipartFile> multipartFiles, HttpServletRequest request, HttpServletResponse response) {
   
String businessLicensePath = null;
   
String filePath = null;
    if
(multipartFiles == null) {
       
return ResponseMessage.normalFailedBack(CommonConstants.RESULT_ERROR);
   
}
   
try {
        businessLicensePath
= outOrgBusinessLicensePath(multipartFiles, filePath);
   
} catch (Exception e) {
       
logger.info("注册异常,异常信息:{}" + e);
   
}
 
    return ResponseMessage.sucsessBack(businessLicensePath);
}

2.     这里我写了一个方法 为了方便业务层调用outOrgBusinessLicensePath

3.     保存到磁盘中方法

 

 public String imageUploadPath(String path) {
        File dir = new File(path);
        //确保路径切实有效
        if (!dir.exists()) {
            dir.mkdirs();
        }
        return path;
    }

 

4.     压缩文件。由于上传上来的照片比较大  可以做一层压缩处理

public String store(MultipartFile mf, String path, boolean realitive) {
        path += File.separator + IdGen.uuid() + mf.getOriginalFilename().substring(mf.getOriginalFilename().lastIndexOf("."));
        File file = new File(path);
        try {
            CommonsMultipartFile cf = (CommonsMultipartFile) mf;
            DiskFileItem fi = (DiskFileItem) cf.getFileItem();
            fi.getStoreLocation();

//          mf.transferTo(file);  文件压缩至200k左右存放磁盘
            Thumbnails.of( fi.getStoreLocation()).size(2000, 3000).toFile(file);
        } catch (IllegalStateException | IOException e) {
            logger.error("IllegalStateException异常,异常信息:{}" + e);
        }
        return path;
    }

 

图片上传并回显

1.获取图片存放的路径,


public ResponseMessage getLicensePhoto(HttpServletRequest request, HttpServletResponse response) {
    try {
        //图片存放路径
        String licensePicture = request.getParameter("licensePicture");

        if (StringUtils.isNotEmpty(licensePicture)) {
            //获取照片地址
            String[] urls = licensePicture.split("");
            if (urls != null && !"".equals(urls)) {
                for (String url : urls) {
                    //读取图片
                    baseUploadService.imageRead(url, response);
                }
            }

        }

 

2. 将图片以IO流形式传输response(得到向客户端输出二进制数据的对象 response.getOutputStream())

public String imageRead(String path, HttpServletResponse response) {
    response.setCharacterEncoding("UTF-8");
    response.reset();
    // 设置返回的文件类型 这一步很重要,如果不设置预览正常,但是前天FileReader.src操作后就有问题。
    response.setContentType("image/jpeg;charset=UTF-8");
    response.setHeader("Content-Disposition", "inline; filename=\"" + path + "\"");

    FileInputStream is;
    try {
        is = new FileInputStream(path);
        // 得到文件大小
        int i = is.available();
        byte data[] = new byte[i];
        // 读数据
        is.read(data);
        is.close();

        // 得到向客户端输出二进制数据的对象
        OutputStream toClient = response.getOutputStream();
        // 输出数据
        toClient.write(data);
        toClient.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
        logger.info("获取图片异常,异常信息:{}" + e);
    }
    return null;
}

 

介绍了图片上传以及回显的方法,中间遇到的坑在哪里呢?

1坑:win系统下和liunx系统下路径地址是有区别的

Win系统支持双// 但是liunx系统是不支持的,所以拼接/的时候要注意

可以使用File.separator来解决/的问题

2.坑:图片上传绝对路径和相对路径的问题

       2.1图片直接存放到tomcat服务器下,照片是可以直接回显的

       2.2图片读到磁盘中则需要以流的形式传给前端显示

3.坑: ?传参的时候一定要注意特殊字符

 十六进制值 
1. + URL
+号表示空格%2B 
2.
空格URL中的空格可以用+号或者编码%20 
3. /
分隔目录和子目录%2F 
4. ?
分隔实际的URL 和参数%3F 
5. %
指定特殊字符%25 
6. #
表示书签%23 
7. & URL
中指定的参数间的分隔符%26 
8. = URL
中指定参数的值%3D 

特殊字符的含义 

URL
编码 

符号

解释

转义

#

用来标志特定的文档位置

%23

%

对特殊字符进行编码

%25

&

分隔不同的变量值对

%26

+

在变量值中表示空格

%2B

/

表示目录路径

%2F

\

表示目录路径

%5C

=

用来连接键和值

%3D

?

表示查询字符串的开始

%3F

空格

空格

%20

.

句号

%2E

:

冒号

%3A

 

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭