Невозможно загрузить файл в Amazon S3 Bucket с локальным хостом в затмении - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь загрузить файл в корзину Amazon S3 через веб-страницу.

Создан «Динамический веб-проект» в Eclipse с сервером Apache Tomcat.Создайте файлы JSP, Servlet и Java.Я использовал файл aws-java-sdk-1.11.335.jar.Попытка загрузить файл изображения нажатием кнопки «Отправить». Исключение класса не найдено.Может кто-нибудь помочь решить эту проблему.

Вот код для файлов JSP, сервлетов и классов:

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);
}

UploadFilestoAWSS3.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)

1 Ответ

0 голосов
/ 05 июня 2018

Проблема в том, что некоторые классы Amazon Web Services SDK не найдены, в частности com.amazonaws.AmazonServiceException, который является основным типом исключения для AWS SDK, что указывает на то, что, вероятно, все файлы AWS SDK отсутствуют в пути к классам Java.

Обратите внимание, что файл aws-java-sdk-1.11.335.jar не является полным AWS SDK (как можно было подумать) и содержит только некоторые файлы метаданных.Java SDK AWS разделен на несколько артефактов - поскольку он настолько велик, что вы не хотите использовать один JAR-файл со всеми классами, вы хотите использовать SDK только для определенных используемых вами служб.

Поскольку вы используете S3, вам, вероятно, просто нужен S3 JAR и его зависимости, как можно увидеть на странице репозитория Maven для AWS S3 SDK .Обратите внимание, что одна из зависимостей - aws-java-sdk-core, в которой находится класс com.amazonaws.AmazonServiceException.

Вы также можете просмотреть все зависимости (и перейти по каталогам, чтобы собрать все нужные вам файлы) вФайл POM в http://central.maven.org/maven2/com/amazonaws/aws-java-sdk-s3/1.11.335/.

Как правило, из-за сложных структур зависимостей, распространенных в наши дни, рекомендуется не загружать JAR-файлы вручную и помещать их по одному в сборку Eclipse.путь, но вместо этого следует использовать Maven.

Если у вас есть стандартный проект Java в eclipse, вы можете щелкнуть правой кнопкой мыши имя проекта в проводнике пакетов, затем выбрать «Конфигурировать» -> «Преобразовать в проект Maven» изаполните некоторые детали в открывшемся диалоговом окне (*).После этого Eclipse создаст файл pom.xml в корне вашего проекта - откройте его, и вы получите специальный редактор для настройки ваших зависимостей.Нажмите на вкладку с надписью «Зависимости», а затем «Добавить», и вы сможете найти aws-java-sdk-s3, добавить его в свой список зависимостей, а затем Maven автоматически загрузит все необходимые файлы JAR и автоматически добавит их в вашу сборку.путь.

*) "Идентификатор группы" - это, как правило, имя верхнего пакета вашего проекта, которое должно выглядеть как обратное доменное имя - например, мой домен geek.co.il, поэтому мой идентификатор группы будет il.co.geek;«Идентификатор артефакта» - это идентификатор одного слова для вашего проекта, например my-project.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...