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
相关产品推荐
相关产品推荐

