java - 无法在 Eclipse 中使用 localhost 将文件上传到 amazon S3 存储桶

标签 java amazon-s3

我正在尝试通过网页将文件上传到 Amazon S3 存储桶。

在 Eclipse 中使用 apache tomcat 服务器创建了一个“动态 Web 项目”。创建 JSP、Servlet 和 Java 文件。我使用了 aws-java-sdk-1.11.335.jar 文件。尝试通过单击提交按钮上传图像文件,发生类未找到异常。有人可以帮忙解决这个问题吗?

这里是 JSP、Servlet 和类文件的代码:

index.jsp:

<form method="post" action="UploadFileServlet" enctype="multipart/form-data">
       <input type="submit" value="Upload" />
</form>

UploadFileServlet.java:

@WebServlet("/UploadFileServlet")
public class UploadFileServlet extends HttpServlet {
private static final long serialVersionUID = 1L;


public UploadFileServlet() {
    super();
}


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

    UploadFilestoAWSS3 uploadfilestoawss3 = new UploadFilestoAWSS3();
    uploadfilestoawss3.UploadFiles();

    PrintWriter out = response.getWriter();
    out.print("Files are uploaded to Bucket");

}


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

上传文件到AWSS3.java

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.CompleteMultipartUploadRequest;
import com.amazonaws.services.s3.model.InitiateMultipartUploadRequest;
import com.amazonaws.services.s3.model.InitiateMultipartUploadResult;
import com.amazonaws.services.s3.model.PartETag;
import com.amazonaws.services.s3.model.UploadPartRequest;
import com.amazonaws.services.s3.model.UploadPartResult;

public class UploadFilestoAWSS3 {

    public void UploadFiles() throws IOException {
        String clientRegion = "region";
        String bucketName = "bucket name";
        String filePath = "C:\\Users\\......\\imagefile.jpg";

        File file = new File(filePath);
        String keyName = file.getName();
        long contentLength = file.length();
        long partSize = 10 * 1024 * 1024; // Set part size to 10 MB. 

        try {
            BasicAWSCredentials awsCreds = new BasicAWSCredentials("Access Key", "Secret Key");
        AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                                .withRegion(clientRegion)
                                .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
                                .build();

        List<PartETag> partETags = new ArrayList<PartETag>();

        InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(bucketName, keyName);
        InitiateMultipartUploadResult initResponse = s3Client.initiateMultipartUpload(initRequest);

        long filePosition = 0;
        for (int i = 1; filePosition < contentLength; i++) {
            partSize = Math.min(partSize, (contentLength - filePosition));

            UploadPartRequest uploadRequest = new UploadPartRequest()
                    .withBucketName(bucketName)
                    .withKey(keyName)
                    .withUploadId(initResponse.getUploadId())
                    .withPartNumber(i)
                    .withFileOffset(filePosition)
                    .withFile(file)
                    .withPartSize(partSize);

            UploadPartResult uploadResult = s3Client.uploadPart(uploadRequest);
            partETags.add(uploadResult.getPartETag());

            filePosition += partSize;
        }

        CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest(bucketName, keyName,
                initResponse.getUploadId(), partETags);
        s3Client.completeMultipartUpload(compRequest);
    }
    catch(AmazonServiceException e) {
        e.printStackTrace();
    }
    catch(SdkClientException e) {
        e.printStackTrace();
    }

}

}

错误是:

Type Exception Report

Message Servlet execution threw an exception

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception
javax.servlet.ServletException: Servlet execution threw an exception
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)


Root Cause
java.lang.NoClassDefFoundError: com/amazonaws/AmazonServiceException
com.shiva.amazonaws.UploadFileServlet.doGet(UploadFileServlet.java:51)
com.shiva.amazonaws.UploadFileServlet.doPost(UploadFileServlet.java:64)
javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)


Root Cause
java.lang.ClassNotFoundException: com.amazonaws.AmazonServiceException
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1292)
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1121)
com.shiva.amazonaws.UploadFileServlet.doGet(UploadFileServlet.java:51)
com.shiva.amazonaws.UploadFileServlet.doPost(UploadFileServlet.java:64)
javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

最佳答案

问题是找不到某些 Amazon Web Services SDK 类,特别是 com.amazonaws.AmazonServiceException,它是 AWS SDK 的基本异常类型 - 表明可能所有Java 类路径中缺少 AWS 开发工具包文件。

请注意,文件 aws-java-sdk-1.11.335.jar 并不是整个 AWS SDK(正如人们可能想象的那样),仅包含一些元数据文件。 AWS Java SDK 分为多个工件 - 因为它太大,您不想使用包含所有类的单个 JAR 文件,您只想将 SDK 用于您正在使用的特定服务。

因为您使用的是 S3,所以您可能只需要 S3 JAR 及其依赖项,如 Maven repository page for the AWS S3 SDK 中所示。 。请注意,依赖项之一是 aws-java-sdk-core,它是 com.amazonaws.AmazonServiceException 类所在的位置。

您还可以在http://central.maven.org/maven2/com/amazonaws/aws-java-sdk-s3/1.11.335/下的POM文件中查看所有依赖项(并导航目录以收集您需要的所有文件)。 .

一般来说,由于现在常见的复杂依赖结构,建议不要手动下载 JAR 并将它们一一放入 Eclipse 构建路径中,而是使用 Maven。

如果您在 Eclipse 中有一个标准 Java 项目,您可以在包资源管理器中右键单击项目名称,然后选择“配置”->“转换为 Maven 项目”,并在打开的对话框中填写一些详细信息(* )。完成后,Eclipse 将在项目的根目录中创建一个 pom.xml 文件 - 打开它,您将获得一个自定义编辑器来设置您的依赖项。单击标有“依赖项”的选项卡,然后单击“添加”,您应该能够搜索 aws-java-sdk-s3,将其添加到您的依赖项列表中,然后 Maven 将自动下载所有内容所需的 JAR 文件并将它们自动添加到您的构建路径。

*) “Group ID”通常是项目的顶级包名称,它应该看起来像域名的倒转 - 例如我的域名是 geek.co.il,所以我的 Group ID 将为 il.co.geek; “Artifact ID”是您项目的单字标识符,例如 my-project

关于java - 无法在 Eclipse 中使用 localhost 将文件上传到 amazon S3 存储桶,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50693000/

相关文章:

Java 空指针异常 - 不明白为什么

amazon-web-services - 直接从 AWS S3 下载时更改用户的文件名

amazon-web-services - 如何在 IAM 角色的信任策略中检查自定义 OpenID 声明?

amazon-web-services - aws - 我可以在没有 S3 的情况下使用 EC2 吗?

reactjs - 读取文本文件 aws-amplify s3 从预签名 URL 读取数据

amazon-s3 - 亚马逊 s3cmd ls

java - 改造 + POST 方法 + www-form-urlencoded

java - Maven依赖树和pom依赖

java - 如何从 Hibernate 配置获取数据源

java - TreeMap 按值排序错误