2016-09-06 3 views
0

Я использую Amazon Java SDK для загрузки файлов на Amazon s3Amazon Java SDK - Загрузить на S3

Хотя использовать версию 1.10.62 артефакта AWS-Java-SDK - следующий код работает отлично - Обратите внимание, все разводка за кулисами работает

public boolean uploadInputStream(String destinationBucketName, InputStream inputStream, Integer numberOfBytes, String destinationFileKey, Boolean isPublic){ 

    try { 
     ObjectMetadata metadata = new ObjectMetadata(); 
     metadata.setContentLength(numberOfBytes);    
     PutObjectRequest putObjectRequest = new PutObjectRequest(destinationBucketName, destinationFileKey, inputStream, metadata); 

     if (isPublic) { 
      putObjectRequest.withCannedAcl(CannedAccessControlList.PublicRead); 
     } else { 
      putObjectRequest.withCannedAcl(CannedAccessControlList.AuthenticatedRead); 
     } 

     final Upload myUpload = amazonTransferManager.upload(putObjectRequest); 

     myUpload.addProgressListener(new ProgressListener() { 
      // This method is called periodically as your transfer progresses 
      public void progressChanged(ProgressEvent progressEvent) { 
       LOG.info(myUpload.getProgress().getPercentTransferred() + "%"); 
       LOG.info("progressEvent.getEventCode():" + progressEvent.getEventCode()); 
       if (progressEvent.getEventCode() == ProgressEvent.COMPLETED_EVENT_CODE) { 
        LOG.info("Upload complete!!!"); 
       } 
      } 
     }); 

     long uploadStartTime = System.currentTimeMillis(); 
     long startTimeInMillis = System.currentTimeMillis(); 
     long logGap = 1000 * loggingIntervalInSeconds; 

     while (!myUpload.isDone()) { 

      if (System.currentTimeMillis() - startTimeInMillis >= logGap) { 
       logUploadStatistics(myUpload, Long.valueOf(numberOfBytes)); 
       startTimeInMillis = System.currentTimeMillis(); 
      } 
     } 
     long totalUploadDuration = System.currentTimeMillis() - uploadStartTime; 
     float totalUploadDurationSeconds = Float.valueOf(totalUploadDuration)/1000; 
     String uploadedPercentageStr = getFormattedUploadPercentage(myUpload); 
     boolean isUploadDone = myUpload.isDone(); 

     if (isUploadDone) { 
      Object[] params = new Object[]{destinationFileKey, totalUploadDuration, totalUploadDurationSeconds}; 
      LOG.info("Successfully uploaded file {} to Amazon. The upload took {} milliseconds ({} seconds)", params); 
      result = true; 
     } 
     LOG.debug("Post put the inputStream to th location {}", destinationFileKey); 
    } catch (AmazonServiceException e) { 
     LOG.error("AmazonServiceException:{}", e); 
     result = false; 
    } catch (AmazonClientException e) { 
     LOG.error("AmazonServiceException:{}", e); 
     result = false; 
    } 

    LOG.debug("Exiting uploadInputStream - result:{}", result); 
    return result; 
} 

Поскольку я мигрировал в версию 1.11.31 в AWS-Java-SDK - этот код перестал работать Все классы остаются нетронутыми и не было никаких предупреждений в моем IDE

Тем не менее - я вижу, что на моем Консоль

[2016-09-06 22:21:58,920] [s3-transfer-manager-worker-1] [DEBUG] com.amazonaws.requestId - x-amzn-RequestId: not available 
[2016-09-06 22:21:58,931] [s3-transfer-manager-worker-1] [DEBUG] com.amazonaws.request - Received error response: com.amazonaws.services.s3.model.AmazonS3Exception: Moved Permanently (Service: null; Status Code: 301; Error Code: 301 Moved Permanently; Request ID: D67813C8A11842AE), S3 Extended Request ID: 3CBHeq6fWSzwoLSt3J7D4AUlOaoi1JhfxAfcN1vF8I4tO1aiOAjqB63sac9Oyrq3VZ4x3koEC5I= 

Выгрузка все еще продолжается, но от прогресса слушателя - код события 8, который выступает за передачу не удалось

Кто-нибудь есть идея, что мне нужно сделать, чтобы получить этот кусок кода снова работает ?

Спасибо Damien

+0

* «Обратите внимание, все проводки за кулисами работ» * ... Я не так уверенно, как и вы, по этому вопросу. Сообщение об ошибке предполагает, что вам нужно передавать область для вашего ведра в конструктор где-то ... и либо вы не являетесь, либо вы передаете регион, который несовместим с ограничением местоположения ковша (региона) ... поэтому запрос отправляется и приходит к неправильной региональной конечной точке S3 и #boom '301 Moved Permanentently'. –

+0

Я использую стандарт США для размещения ковша. Вы порекомендовали бы установить конкретный ковш. Хаа доверяй мне свои проблемы, но сейчас он работает в производственной среде уже около двух лет с различными обновлениями в библиотеке - это первое обновление, чтобы разбить его – Damien

+0

О, я не сомневаюсь, что проводка была правильной на некоторых но это не является неслыханным для того, чтобы вещи работали, как ожидалось, «случайно», пока кто-то не удалит предположение, на которое вы полагались. К сожалению, я редко использую SDK. Мой опыт - это первичный опыт работы с конечными точками API, понимание того, что они ожидают и возвращение, и именно поэтому я чувствую себя достаточно уверенным в том, что это как-то связано с выбором конечных точек. Если у вас есть контракт на поддержку, идентификатор запроса и идентификатор расширенного запроса, вероятно, будут поддерживать поддержку для отслеживания запроса и дать вам подсказку. –

ответ

1

попробуйте изменить его к этому: public void progressChanged(ProgressEvent progressEvent) { LOG.info(myUpload.getProgress().getPercentTransferred() + "%"); LOG.info("progressEvent.getEventCode():" + progressEvent.getEventType()); if (progressEvent.getEventType() == ProgressEventType.TRANSFER_COMPLETED_EVENT) { LOG.info("Upload complete!!!"); } }

Похоже, что вы работаете в какой-то устаревший код.

В com.amazonaws.event.ProgressEventType, значение 8 относится к HTTP_REQUEST_COMPLETED_EVENT

  • COMPLETED_EVENT_CODE осуждается
  • getEventCode осуждается

относятся к этому ->https://github.com/aws/aws-sdk-java/blob/master/aws-java-sdk-core/src/main/java/com/amazonaws/event/ProgressEvent.java

+0

Спасибо - я попробую это и дам вам знать, как это происходит – Damien

0

Я обновил свои версии S3 библиотеки, сгенерировали новые ключи доступа, а также новое ведро

Теперь все работает, как ожидалось

Смежные вопросы