Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将文件从React前端上传到带有Spring后端的S3 bucket?_Java_Spring_Reactjs_Spring Boot_Amazon S3 - Fatal编程技术网

Java 如何将文件从React前端上传到带有Spring后端的S3 bucket?

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

我正试图通过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/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.");
        }

}