使用 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 请求中不存在所需的请求部分“文件”的主要内容,如果未能解决你的问题,请参考以下文章

反应节点通过 axios 传递文件与 multer 错误 500

无法使用 axios 发送 http POST 请求

如何修复 Axios 中的图片上传问题

multer 解析文件上传

express文件上传中间件Multer详解

如何使用 javascript fetch api 和 express multer 上传图像