• 解决springboot接受buffer文件为null(从picgo上传buffer看springmvc处理过程)


    1. 前言:

    picgo插件的简单开发

    上篇文章我们简单写了picgo上传插件,但是当我们测试的时候,发现问题了,后端MultipartFile file接受到的文件为null。
    在这里插入图片描述

    2. 排查问题:

    参考的文档

    1. picgo api列表
    2. 关于multipart form-data中filename的问题

    2.1. 我们先排查前端

    const handle = async (ctx) => {
    	let userConfig = ctx.getConfig('picBed.haowan-uploader')
    	if (!userConfig) {
    		throw new Error('Can\'t find uploader config')
    	}
    	const Url = userConfig.Url
    	const Token = userConfig.Token
    
    	const imgList = ctx.output
    	for (let i in imgList) {
    		let image = imgList[i].buffer
    		if (!image && imgList[i].base64Image) {
    			image = Buffer.from(imgList[i].base64Image, 'base64')
    		}
    		const postConfig = postOptions(Url, Token, imgList[i].fileName, image)
    		let body = await ctx.request(postConfig)
    		body = JSON.parse(body)
    
    	return ctx
    }
    
    const postOptions = (Url, Token, fileName, image) => {
    	return {
    		method: 'POST',
    		url: Url + `/api/picgo/upload`,
    		headers: {
    			"contentType": 'multipart/form-data',
    			'Authorization':  Token,
    			'User-Agent': 'PicGo'
    		},
    		formData: {
    			file : image,
    
    			fileName
    				}
    	}
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    1. 我首先考虑的是我api使用问题

    在这里插入图片描述
    🌴我使用的是pico的.request方法,作者描述是通过使用axios实现的。
    在这里插入图片描述
    在这里插入图片描述
    🌴使用formdata属性配置表单数据是没有问题的,可以看到picgo的底层通过读取formdata属性,把你所配置的数据读取配置到axios发送的data数据中。是axios的常用实现。

    😄 由于我们使用的是picgo gui,所以控制台无法方便的使用,所以我们下面从后端排查数据是否发送
    在这里插入图片描述

    2.2. 排查后端

    1. 在参数接收这里点上debug
      在这里插入图片描述
      🌴我们可以看出并非没有接受文件,只是在最后并没有转换成文件。
      在这里插入图片描述

    2. 查看body流读取的源码
      在这里插入图片描述

    Collection<Part> parts = request.getParts();
                this.multipartParameterNames = new LinkedHashSet(parts.size());
                MultiValueMap<String, MultipartFile> files = new LinkedMultiValueMap(parts.size());
                Iterator var4 = parts.iterator();
    
                while(var4.hasNext()) {
                    Part part = (Part)var4.next();
                    String headerValue = part.getHeader("Content-Disposition");
                    ContentDisposition disposition = ContentDisposition.parse(headerValue);
                    String filename = disposition.getFilename();
                    if (filename != null) {
                        if (filename.startsWith("=?") && filename.endsWith("?=")) {
                            filename = StandardMultipartHttpServletRequest.MimeDelegate.decode(filename);
                        }
    
                        files.add(part.getName(), new StandardMultipartFile(part, filename));
                    } else {
                        this.multipartParameterNames.add(part.getName());
                    }
                }
    
                this.setMultipartFiles(files);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述

    String filename = disposition.getFilename();,由于这里文件名为空,以致于mvc根本不处理文件流。

    那么解决方案就显而易见,给添加上文件流就行。

    3. 解决方案(添加文件名):

    1. https://www.rfc-editor.org/rfc/rfc1867 (formdata上传文件描述)

    在这里插入图片描述
    2. formdata buffer流添加文件名

    在这里插入图片描述

    formData: {
    			file: {
    				value: image,
    				options: {
    					filename: fileName
    				}
    			}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    可以在formdata中可选属性options添加文件名的选项。就可以成功读取了。
    在这里插入图片描述

  • 相关阅读:
    基于模糊小波神经网络的空中目标威胁评估(Matlab代码实现)
    【Go语言】Go语言中的字典
    C语言之预处理
    GoFrame框架快速入门教程
    Git 创建新分支提交代码 删除提交的.idea 文件夹 强制拉取其他分支
    【多标签, 极限的多标签算法】评价指标梳理
    Maven高级知识【模块开发、多环境开发配置、私服】
    mysql5.6免安装版安装步骤
    【Rust日报】2022-08-06 Fang, Rust的一个异步后台处理
    flex布局中的几个小技巧
  • 原文地址:https://blog.csdn.net/faker1234546/article/details/134357367