java上传文件的三个条件,需要在Java中上传文件的S3

I have started working on AWS recently. I am currently working on developing upload functionality to S3 storage.

As per my understanding there could be 2 ways to upload a file to S3:-

Client's file gets uploaded to my server and i upload this file to S3 server using my credentials. [i will also able to hide this from client as i will not be showing the upload details.]

Upload directly to S3

I was able to implement the first approach using simple upload api , but i want to skip the "write uploaded file to server disk" part and stream the content directly to S3 storage, while saving the upload details in my database. I also want to achieve the abstraction of AWS details. How do i do it ?? Please help.

Thanks in advance

解决方案

I am using using byte stream array to write file data to S3 object.

Code for servlet which is receiving uploaded file:-

import java.io.IOException;

import java.io.PrintWriter;

import java.util.List;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;

import org.apache.commons.fileupload.disk.DiskFileItemFactory;

import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.src.code.s3.S3FileUploader;

public class FileUploadHandler extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

doPost(request, response);

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

PrintWriter out = response.getWriter();

try{

List multipartfiledata = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);

//upload to S3

S3FileUploader s3 = new S3FileUploader();

String result = s3.fileUploader(multipartfiledata);

out.print(result);

} catch(Exception e){

System.out.println(e.getMessage());

}

}

}

Code which is uploading this data as AWS object:-

import java.io.ByteArrayInputStream;

import java.io.IOException;

import java.util.List;

import java.util.UUID;

import org.apache.commons.fileupload.FileItem;

import com.amazonaws.AmazonClientException;

import com.amazonaws.AmazonServiceException;

import com.amazonaws.auth.ClasspathPropertiesFileCredentialsProvider;

import com.amazonaws.services.s3.AmazonS3;

import com.amazonaws.services.s3.AmazonS3Client;

import com.amazonaws.services.s3.model.ObjectMetadata;

import com.amazonaws.services.s3.model.PutObjectRequest;

import com.amazonaws.services.s3.model.S3Object;

public class S3FileUploader {

private static String bucketName = "***NAME OF YOUR BUCKET***";

private static String keyName = "Object-"+UUID.randomUUID();

public String fileUploader(List fileData) throws IOException {

AmazonS3 s3 = new AmazonS3Client(new ClasspathPropertiesFileCredentialsProvider());

String result = "Upload unsuccessfull because ";

try {

S3Object s3Object = new S3Object();

ObjectMetadata omd = new ObjectMetadata();

omd.setContentType(fileData.get(0).getContentType());

omd.setContentLength(fileData.get(0).getSize());

omd.setHeader("filename", fileData.get(0).getName());

ByteArrayInputStream bis = new ByteArrayInputStream(fileData.get(0).get());

s3Object.setObjectContent(bis);

s3.putObject(new PutObjectRequest(bucketName, keyName, bis, omd));

s3Object.close();

result = "Uploaded Successfully.";

} catch (AmazonServiceException ase) {

System.out.println("Caught an AmazonServiceException, which means your request made it to Amazon S3, but was "

+ "rejected with an error response for some reason.");

System.out.println("Error Message: " + ase.getMessage());

System.out.println("HTTP Status Code: " + ase.getStatusCode());

System.out.println("AWS Error Code: " + ase.getErrorCode());

System.out.println("Error Type: " + ase.getErrorType());

System.out.println("Request ID: " + ase.getRequestId());

result = result + ase.getMessage();

} catch (AmazonClientException ace) {

System.out.println("Caught an AmazonClientException, which means the client encountered an internal error while "

+ "trying to communicate with S3, such as not being able to access the network.");

result = result + ace.getMessage();

}catch (Exception e) {

result = result + e.getMessage();

}

return result;

}

}

Note :- I am using aws properties file for credentials.

Hope this helps.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值