Java 如何将文件从React前端上传到带有Spring后端的S3 bucket?
我正试图通过React将文件上传到s3存储桶中,我正在努力使用4xx和5xx:( 以下是我的代码库:Java 如何将文件从React前端上传到带有Spring后端的S3 bucket?,java,spring,reactjs,spring-boot,amazon-s3,Java,Spring,Reactjs,Spring Boot,Amazon S3,我正试图通过React将文件上传到s3存储桶中,我正在努力使用4xx和5xx:( 以下是我的代码库: onChangeHandler = event => { const data = new FormData(); data.append('data', event.target.files[0], event.target.files[0].name); axios .post( '/api/attachments/t
onChangeHandler = event => {
const data = new FormData();
data.append('data', event.target.files[0], event.target.files[0].name);
axios
.post(
'/api/attachments/temporary',
{
documents: data,
tempDir: this.generateUuid()
},
{
headers: {
'Content-Type': 'multipart/form-data'
}
}
)
.then(data => {
console.log(`data --- `, data);
})
.catch(e => {
console.log(` --- `, e);
});
};
render() {
return (
<input type='file' name='file' onChange={this.onChangeHandler} />
);
}
onChangeHandler=event=>{
const data=新表单数据();
data.append('data',event.target.files[0],event.target.files[0].name);
axios
.邮政(
“/api/attachments/temporary”,
{
文件:数据,
tempDir:this.generateUid()
},
{
标题:{
“内容类型”:“多部分/表单数据”
}
}
)
。然后(数据=>{
log(`data--`,data);
})
.catch(e=>{
console.log(`-`,e);
});
};
render(){
返回(
);
}
如果我发送这篇文章,我会得到500,并且出现以下错误:
java.io.IOException:UT000036:解析多部分数据时连接终止
我还注意到文档属性为空:
这是后端的API文档:
我如何修复它?也许,我需要以某种方式将文件本地转换为二进制数据等?我们可以上传图像和.pdf文件
谢谢!如果您使用
multipartttpServletRequest
步骤1:添加依赖项
pom.xml
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
步骤4:
@RequestMapping(value="/api/attachments/temporary")
public ServiceResponse uploadFile(MultipartHttpServletRequest request){
if (request.getFileNames().hasNext()) {
//1. get the files from the request object
Iterator<String> itr = request.getFileNames();
MultipartFile multipartFileImage = request.getFile(itr.next());
StringBuilder sb=new StringBuilder(multipartFileImage.getOriginalFilename());
String filename=sb.substring(sb.lastIndexOf("."), sb.length()); // getting file extension
filename="("+email+")"+filename; // concatenation unique value i.e email to its file name with extension
user.setProfileImage(filename);
try {
File saveImage = new File(imagePath+filename); //Local path for image file
PropertiesCredentials cred = new PropertiesCredentials(getClass().getClassLoader().getResourceAsStream(awsCredentialsProperties));
logger.debug("Aws access key id :"+cred.getAWSAccessKeyId());
logger.debug("Aws Secret key :"+cred.getAWSSecretKey());
AWSCredentials credentials = new BasicAWSCredentials(cred.getAWSAccessKeyId(),
cred.getAWSSecretKey()
);
AmazonS3 s3client = AmazonS3ClientBuilder
.standard()
.withCredentials(new AWSStaticCredentialsProvider(credentials))
.withRegion(#) // Your region
.build();
PutObjectResult putResult = s3client.putObject(
"<bucket name>",
filename,
saveImage
);
multipartFileImage.transferTo(saveImage);
logger.debug("putResult :"+putResult.getVersionId());
}catch(Exception e) {
return ServiceResponse.createFailureResponse("Unable to upload image due to internet connection failure. Try again later.");
}
}
@RequestMapping(value=“/api/attachments/temporary”)
公共服务响应上载文件(MultipartHttpServletRequest请求){
if(request.getFileNames().hasNext()){
//1.从请求对象获取文件
迭代器itr=request.getFileNames();
MultipartFile multipartFileImage=request.getFile(itr.next());
StringBuilder sb=新的StringBuilder(multipartFileImage.getOriginalFilename());
String filename=sb.substring(sb.lastIndexOf(“.”),sb.length());//获取文件扩展名
filename=“(“+email+”)+filename;//将唯一值(即电子邮件)连接到其扩展名为的文件名
user.setProfileImage(文件名);
试一试{
File saveImage=新文件(imagePath+文件名);//图像文件的本地路径
PropertiesCred=新的PropertiesCredentials(getClass().getClassLoader().getResourceAsStream(awsCredentialsProperties));
logger.debug(“Aws访问密钥id:+cred.getAWSAccessKeyId());
debug(“Aws密钥:+cred.getAWSSecretKey());
AWSCredentials credentials=new BasicAWSCredentials(cred.getAWSAccessKeyId(),
cred.getAWSSecretKey()
);
AmazonS3 s3client=AmazonS3ClientBuilder
.standard()
.具有凭证(新AWSStaticCredentialsProvider(凭证))
.withRegion(#)//您所在的地区
.build();
PutObjectResult putResult=s3client.putObject(
"",
文件名,
保存图像
);
multipartFileImage.transferTo(saveImage);
debug(“putResult:+putResult.getVersionId());
}捕获(例外e){
返回ServiceResponse.createFailureResponse(“由于internet连接失败,无法上载图像。请稍后重试”);
}
}
最好将图像保存在本地,因为如果您的图像要求经常可用,那么每次从s3存储桶获取图像是不可行的。应该是有帮助的。我认为问题在于您将json数据与文件/表单数据上载混合在一起,这可能会有所帮助->
@RequestMapping(value="/api/attachments/temporary")
public ServiceResponse uploadFile(MultipartHttpServletRequest request){
if (request.getFileNames().hasNext()) {
//1. get the files from the request object
Iterator<String> itr = request.getFileNames();
MultipartFile multipartFileImage = request.getFile(itr.next());
StringBuilder sb=new StringBuilder(multipartFileImage.getOriginalFilename());
String filename=sb.substring(sb.lastIndexOf("."), sb.length()); // getting file extension
filename="("+email+")"+filename; // concatenation unique value i.e email to its file name with extension
user.setProfileImage(filename);
try {
File saveImage = new File(imagePath+filename); //Local path for image file
PropertiesCredentials cred = new PropertiesCredentials(getClass().getClassLoader().getResourceAsStream(awsCredentialsProperties));
logger.debug("Aws access key id :"+cred.getAWSAccessKeyId());
logger.debug("Aws Secret key :"+cred.getAWSSecretKey());
AWSCredentials credentials = new BasicAWSCredentials(cred.getAWSAccessKeyId(),
cred.getAWSSecretKey()
);
AmazonS3 s3client = AmazonS3ClientBuilder
.standard()
.withCredentials(new AWSStaticCredentialsProvider(credentials))
.withRegion(#) // Your region
.build();
PutObjectResult putResult = s3client.putObject(
"<bucket name>",
filename,
saveImage
);
multipartFileImage.transferTo(saveImage);
logger.debug("putResult :"+putResult.getVersionId());
}catch(Exception e) {
return ServiceResponse.createFailureResponse("Unable to upload image due to internet connection failure. Try again later.");
}
}