使用 multer 文件输入的 axios 请求中不存在所需的请求部分“文件”
Posted
技术标签:
【中文标题】使用 multer 文件输入的 axios 请求中不存在所需的请求部分“文件”【英文标题】:Required request part 'file' is not present from axios request using multer file input 【发布时间】:2020-01-06 00:38:35 【问题描述】:我正在使用使用 axios 的 http post 请求快速调用 spring-boot 后端的节点应用程序。节点应用程序中的请求是多部分表单数据请求,由节点控制器层中的 multer 处理。因此,我有一个缓冲区,我用它来创建一个表单数据对象,以将我的 axios 请求传递给我的 spring-boot 后端。
当我调用后端时,我得到了
所需的请求部分“文件”不存在
我还尝试将 spring-boot 层中的请求作为直接的 httpservletrequest 读取,这表明该部件存在,但随后将部件解释为 MultipartFile 证明是一个挑战
Multer 选项和方法
const multerOptions =
storage: multer.memoryStorage()
;
exports.upload = multer(multerOptions).single('file');
使用 req.file 调用方法
uploadResult = await uploadTrack(req.file);
axios 请求后端
const uploadTrack = async (uploadTrack) =>
let formData = new FormData();
let file = streamifier.createReadStream(uploadTrack.buffer);
formData.append('file', file);
axios.post('http://localhost:8080/trackUpload', formData, headers: 'Content-Type': `multipart/form-data; boundary=$formData._boundary`);
弹簧启动控制器
@PostMapping("/trackUpload")
public ResponseEntity handleFileUpload(@RequestParam("file") MultipartFile file,
RedirectAttributes redirectAttributes)
String outcome = "successfully uploaded " + file.getOriginalFilename();
try
storageService.store(file);
catch (IOException e)
outcome = "failed to save " + file.getOriginalFilename();
return new ResponseEntity(outcome, HttpStatus.INTERNAL_SERVER_ERROR);
return new ResponseEntity(outcome, HttpStatus.OK);
完整的错误(实际上是WARN)消息没有堆栈,在进入控制器之前被spring boot抛出
WARN 3923 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver:已解决 [org.springframework.web.multipart.support.MissingServletRequestPartException:所需的请求部分“文件”不存在]
【问题讨论】:
【参考方案1】:所以我有一个解决方案,这不是公认的答案,因为我讨厌它。
我将文件名粘贴在请求中,并以已知顺序从 servlet 请求中提取部分并将它们作为 inputStream 写入文件
@PostMapping("/trackSave")
public ResponseEntity handleFileSave(HttpServletRequest request) throws IOException, ServletException
try
Collection<Part> parts = request.getParts();
ArrayList<Part> partsList = new ArrayList<Part>(parts);
String filename = partsList.get(1).getName();
File file = new File(FILE_TO + filename);
FileUtils.copyInputStreamToFile(partsList.get(0).getInputStream(), file);
return new ResponseEntity("Success, " + filename + " saved", HttpStatus.OK);
catch (Exception e)
System.out.println(e.getMessage());
return new ResponseEntity("unable to save file", HttpStatus.OK);
哎呀,请给我一个更好的解决方案
【讨论】:
【参考方案2】:我相信您所要做的就是将您的 formData 更改为以下内容
formData.append('file', file, "filename");
注意到添加了一个文件名吗?尝试一下,我相信它可以与原始代码一起使用。
【讨论】:
以上是关于使用 multer 文件输入的 axios 请求中不存在所需的请求部分“文件”的主要内容,如果未能解决你的问题,请参考以下文章