2016-09-06 163 views
0

我使用的是亞馬遜的Java SDK將文件上傳到亞馬遜S3亞馬遜的Java SDK - 上傳到S3

同時使用神器AWS-Java的SDK版本62年1月10日 - 下面的代碼工作完美 - 注意,所有的幕後的佈線工程

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

因爲我遷移到AWS-Java的SDK的31年1月11日版本 - 這個代碼停止工作 所有類保持不變,並有在我的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,將代表傳輸失敗

沒有人有任何的想法是什麼,我需要做的就是代碼的再次合作這個塊?

謝謝 達米安

+0

*「請注意所有的場景作品背後的接線」 * ...我沒有信心,你是,在這一點上。錯誤消息表明您需要將桶的某個區域傳遞給某個構造函數,或者您不是,或者您傳遞的是與該桶的位置約束(區域)不一致的區域...所以請求被髮送到並且到達錯誤的S3區域端點,並且#boom「301永久移動」。 –

+0

我正在使用美國標準的桶位置。你會推薦設置一個特定的存儲桶嗎?哈哈相信我對你的擔憂,但是這已經在現在的生產環境中運行了近2年,並且對圖書館進行了各種升級 - 這是第一次打破它的更新 – 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版本庫,生成新的訪問密鑰和新的存儲桶

現在一切正常