Jakarta ee 需要在Java中的S3上上载文件

Jakarta ee 需要在Java中的S3上上载文件,jakarta-ee,file-upload,amazon-web-services,upload,amazon-s3,Jakarta Ee,File Upload,Amazon Web Services,Upload,Amazon S3,我最近开始在AWS上工作。我目前正在开发S3存储的上传功能 据我所知,有两种方法可以将文件上载到S3:- 客户端的文件被上传到我的服务器,我使用我的凭据将此文件上传到S3服务器。[我也可以对客户端隐藏此信息,因为我不会显示上载详细信息。] 直接上传到S3 我能够使用实现第一种方法,但我想跳过“将上传的文件写入服务器磁盘””部分,将内容直接流式传输到S3存储,同时将上传详细信息保存在数据库中。我还想实现AWS细节的抽象。我该怎么做??请帮忙。 提前感谢尝试使用POST对象。使用它不需要编写任何代码

我最近开始在AWS上工作。我目前正在开发S3存储的上传功能

据我所知,有两种方法可以将文件上载到S3:-

  • 客户端的文件被上传到我的服务器,我使用我的凭据将此文件上传到S3服务器。[我也可以对客户端隐藏此信息,因为我不会显示上载详细信息。]

  • 直接上传到S3

  • 我能够使用实现第一种方法,但我想跳过“将上传的文件写入服务器磁盘””部分,将内容直接流式传输到S3存储,同时将上传详细信息保存在数据库中。我还想实现AWS细节的抽象。我该怎么做??请帮忙。
    提前感谢

    尝试使用POST对象。使用它不需要编写任何代码。请参阅中的更多详细信息

    如果您不怕javascript,另一种操作是S3的javascript SDK。您可以在浏览器中运行它


    预签名的url也可以工作,您可以在浏览器(通过javascript)或后端生成url,并让浏览器直接将请求发送到S3。

    我正在使用字节流数组将文件数据写入S3对象

    接收上载文件的servlet的代码:-

    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<FileItem> 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());
            }
        }
    }
    
    import java.io.IOException;
    导入java.io.PrintWriter;
    导入java.util.List;
    导入javax.servlet.ServletException;
    导入javax.servlet.http.HttpServlet;
    导入javax.servlet.http.HttpServletRequest;
    导入javax.servlet.http.HttpServletResponse;
    导入org.apache.commons.fileupload.FileItem;
    导入org.apache.commons.fileupload.disk.DiskFileItemFactory;
    导入org.apache.commons.fileupload.servlet.ServletFileUpload;
    导入com.src.code.s3.S3FileUploader;
    公共类FileUploadHandler扩展了HttpServlet{
    受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
    doPost(请求、响应);
    }
    受保护的void doPost(HttpServletRequest请求、HttpServletResponse响应)引发ServletException、IOException{
    PrintWriter out=response.getWriter();
    试一试{
    List multipartfiledata=new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
    //上传到S3
    S3FileUploader s3=新的S3FileUploader();
    字符串结果=s3.fileUploader(multipartfiledata);
    打印(结果);
    }捕获(例外e){
    System.out.println(e.getMessage());
    }
    }
    }
    
    作为AWS对象上载此数据的代码:-

    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<FileItem> 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;
        }
    }
    
    import java.io.ByteArrayInputStream;
    导入java.io.IOException;
    导入java.util.List;
    导入java.util.UUID;
    导入org.apache.commons.fileupload.FileItem;
    导入com.amazonaws.AmazonClientException;
    导入com.amazonaws.AmazonServiceException;
    导入com.amazonaws.auth.ClasspathPropertiesFileCredentialsProvider;
    导入com.amazonaws.services.s3.AmazonS3;
    导入com.amazonaws.services.s3.amazon3Client;
    导入com.amazonaws.services.s3.model.ObjectMetadata;
    导入com.amazonaws.services.s3.model.PutObjectRequest;
    导入com.amazonaws.services.s3.model.s3对象;
    公共类S3FileUploader{
    私有静态字符串bucketName=“***您的BUCKET的名称***”;
    私有静态字符串keyName=“Object-”+UUID.randomUUID();
    公共字符串文件上载程序(列表文件数据)引发IOException{
    AmazonS3 s3=新的AmazonS3客户端(新的类路径属性FileCredentialsProvider());
    String result=“上传失败原因”;
    试一试{
    S3Object S3Object=新的S3Object();
    ObjectMetadata omd=新的ObjectMetadata();
    setContentType(fileData.get(0.getContentType());
    setContentLength(fileData.get(0.getSize());
    setHeader(“filename”,fileData.get(0.getName());
    ByteArrayInputStream bis=新的ByteArrayInputStream(fileData.get(0.get());
    s3Object.setObjectContent(bis);
    s3.putObject(新的PutObjectRequest(bucketName、keyName、bis、omd));
    s3Object.close();
    结果=“已成功上载。”;
    }捕获(AmazonServiceException ase){
    println(“捕获到一个AmazonServiceException,这意味着您的请求向AmazonS3发出,但被拒绝了”
    +“由于某种原因被拒绝,并有错误响应。”);
    System.out.println(“错误消息:+ase.getMessage());
    System.out.println(“HTTP状态代码:+ase.getStatusCode());
    System.out.println(“AWS错误代码:+ase.getErrorCode());
    System.out.println(“错误类型:+ase.getErrorType());
    System.out.println(“请求ID:+ase.getRequestId());
    结果=结果+ase.getMessage();
    }捕获(AmazonClientException ace){
    System.out.println(“捕获到AmazonClientException,这意味着客户端在运行时遇到内部错误”
    +“试图与S3通信,例如无法访问网络。”);
    result=result+ace.getMessage();
    }捕获(例外e){
    结果=结果+e.getMessage();
    }
    返回结果;
    }
    }
    
    注意:-我正在使用aws属性文件作为凭据。


    希望这有帮助。

    在Linux服务器上创建一个cfg文件

    vim ~/.aws/credentials
    
    [default]
    aws_access_key_id=AKIAIRVAQ7MASDFRTY
    aws_secret_access_key=PSIAiFv1Fj/2DySyUQWeCfTyosEoOLwqdmqrRlI
    
    并保存该文件。用NetBeans编写代码。还可以添加库:

    httpcore-4.4.9.jar
    aws-java-sdk-s3-1.11.367.jar
    aws-java-sdk-kms-1.11.367.jar
    aws-java-sdk-core-1.11.367.jar
    aws-java-sdk-1.4.0.1.jar
    joda-time-2.8.1.jar
    jmespath-java-1.11.367.jar
    jackson-dataformat-cbor-2.6.7.jar
    jackson-databind-2.6.7.1.jar
    jackson-core-2.6.7.jar
    jackson-annotations-2.6.0.jar
    ion-java-1.0.2.jar
    httpcore-4.3.2.jar
    httpclient-4.5.5.jar
    commons-logging-1.1.3.jar
    package tests3;
    
     /**
    *
     * @author ravi.tyagi
    */
    import java.io.File;
    import com.amazonaws.AmazonServiceException;
    import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
    import com.amazonaws.services.s3.AmazonS3;
    import com.amazonaws.services.s3.AmazonS3Client;
    import com.amazonaws.services.s3.transfer.Download;
    import com.amazonaws.services.s3.transfer.TransferManager;
    import com.amazonaws.services.s3.transfer.TransferManagerBuilder;
    import com.amazonaws.services.s3.transfer.Upload;
    
    public class TestS3 {
    
    
    
    
        public static void main(String[] args) throws Exception {
            String bucketName = "*******BucketName*******";
            String keyName = "recordings/0035db40bb32f4d95f0f23b4514d123g/videos/output/0035db40bb32f4d95f0f23b4514d123g"; // Also the name path from which you want save on S3 without Extension it will be same source file
            String filePath = "/usr/local/WowzaStreamingEngine-4.7.6/content/0035db40bb32f4d95f0f23b4514d123g.mp4";
            try {
                AmazonS3 s3Client = new AmazonS3Client(DefaultAWSCredentialsProviderChain.getInstance());
                TransferManager tm = TransferManagerBuilder.standard().withS3Client(s3Client).build();
                Upload upload = tm.upload(bucketName, keyName, new File(filePath));  
                System.out.println("---****************--->"+s3Client.getUrl(bucketName, "0035db40bb32f4d95f0f23b4514d123g.mp4").toString());
                upload.waitForCompletion();
                System.out.println("---*--->"+s3Client.getUrl(bucketName, "0035db40bb32f4d95f0f23b4514d123g.mp4").toString());
                System.out.println("--**->"+upload.getProgress());
                System.out.println("---***--->"+s3Client.getUrl(bucketName, "0035db40bb32f4d95f0f23b4514d123g.mp4").toString());
                System.out.println("--****->"+upload.getState());
                System.out.println("---*****--->"+s3Client.getUrl(bucketName, "0035db40bb32f4d95f0f23b4514d123g.mp4").toString());
                System.out.println("--******->0");
                System.out.println("Object upload complete");
                System.out.println("--**********-->1");
                tm.shutdownNow();
            } catch (AmazonServiceException e) {
                System.out.println("Exception :- "+e);
            }
            System.out.println("----->2");
    
        }
    
    }
    
       aws.s3.access.key =************
       aws.s3.secret.key=**************
       aws.s3.bucket.name=*************
       aws.s3.region=*************