You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot接收文件上传报No primary or single public constructor for File错误问询

报错根因

该错误是Spring Boot无法将HTTP请求中的上传内容自动转换为java.io.File类型参数导致的:java.io.File没有无参公共构造函数,Spring MVC没有对应的默认逻辑将请求数据反序列化为File对象。同时你的前端代码也存在传参错误。


修复步骤

1. 前端代码修正

你存在两个问题:一是创建了FormData对象但请求时没有传,直接传了Blob;二是直接将数组放入Blob会默认调用toString转为逗号分隔字符串,不是标准JSON格式。
修正后的代码:

downloadableData() {
  // 先将二维数组序列化为JSON字符串
  const jsonContent = JSON.stringify(this.locationData)
  const blob = new Blob([jsonContent],  {type: 'application/json'});
  const formData = new FormData();
  formData.append("document", blob, "location_data.json");
  // 传封装好的FormData,设置对应请求头
  axios.post("http://localhost:8080/api/v1/targetLocation/uploadStreamToS3Bucket", formData, {
    headers: {
      'Content-Type': 'multipart/form-data'
    }
  })
},

2. 后端代码修正

接口入参改为接收Spring提供的MultipartFile类型,不需要转存为本地File,直接拿输入流上传到S3即可,性能更高:

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import com.amazonaws.services.s3.model.ObjectMetadata;
import java.io.IOException;

@PostMapping("/uploadStreamToS3Bucket")
public void uploadStreamToS3Bucket(@RequestParam("document") MultipartFile locations) {
    try {
        AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                .withRegion(String.valueOf(awsRegion))
                .build();

        String bucketName = "downloadable-cases";
        String fileName = connectionRequestRepository.findStream() +".json";
        // 构造S3上传的元数据
        ObjectMetadata metadata = new ObjectMetadata();
        metadata.setContentType(locations.getContentType());
        metadata.setContentLength(locations.getSize());
        // 直接用输入流上传,不需要生成本地File
        s3Client.putObject(new PutObjectRequest(bucketName, fileName, locations.getInputStream(), metadata));
    } catch (AmazonServiceException | IOException ex) {
        System.out.println("Error: " + ex.getMessage());
        ex.printStackTrace();
    }
}

如果确实需要生成本地File临时存储,可以调用locations.transferTo(new File("临时文件路径"))生成,但用完要主动删除临时文件避免磁盘占用。


内容的提问来源于stack exchange,提问作者JTip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:48:02