2012-11-29 21 views
3

我試圖修復以下代碼導致S3上的0字節文件並沒有錯誤消息的錯誤。FileUpload到亞馬遜S3結果爲0字節文件

這段代碼以一個包含圖像和所需圖像路徑(從數據庫包裝器對象)到亞馬遜S3的Stream(來自命名不正確的FileUpload4)爲饋送,但文件本身從未上傳。

CloudUtils.UploadAssetToCloud(FileUpload4.FileContent, ((ImageContent)auxSRC.Content).PhysicalLocationUrl); 
ContentWrapper.SaveOrUpdateAuxiliarySalesRoleContent(auxSRC); 

第二行簡單地節省了存儲關於(假想)上傳的圖像信息的數據庫對象。此保存正在進行,證明上述線路沒有錯誤地運行。

上面的調用的第一行中的這種方法,獲取適當的bucketname後:

public static bool UploadAssetToCloud(Stream asset, string path, string bucketName, AssetSecurity security = AssetSecurity.PublicRead) 
{ 
    TransferUtility txferUtil; 
    S3CannedACL ACL = GetS3ACL(security); 

    using (txferUtil = new Amazon.S3.Transfer.TransferUtility(AWSKEY, AWSSECRETKEY)) 
    { 
     TransferUtilityUploadRequest request = new TransferUtilityUploadRequest() 
      .WithBucketName(bucketName) 
      .WithTimeout(TWO_MINUTES) 
      .WithCannedACL(ACL) 
      .WithKey(path); 
     request.InputStream = asset; 
     txferUtil.Upload(request); 
    } 

    return true; 
} 

我已經確定流是一個很好的流 - 我可以將它保存任何地方我有權限,存在存儲區並且路徑正常(該文件在S3上的目標位置創建,它只是不會使用流的內容填充)。我接近我的智慧結局,在這裏 - 我錯過了什麼?

編輯:我的一位同事指出,它會更好FileUpload的PostsFile屬性。相反,我現在正在從這個流中抽取流。它仍然沒有工作。

+0

流的位置是什麼?您可能需要將位置重置爲零。 – JMarsch

回答

2

流的位置是否正確?檢查asset.Position以確保位置設置爲流的開頭。

asset.Seek(0, SeekOrigin.Begin); 

編輯

OK,更多的猜測(我到猜測,雖然): (所有這一切都是假設,你可以從你的輸入流通過手還在讀就好了」 「)

  1. 只是用於測試,嘗試對TransferUtility簡單的上傳方法之一 - 也許一個只需要一個文件路徑字符串。如果可行,那麼UploadRequest對象上可能會設置其他屬性。

  2. 如果您將UploadProgressEvent掛接到UploadRequest對象上,那麼您是否會獲得有關出錯的任何其他線索?

  3. 我注意到UploadRequest的api同時包含InputStream屬性和WithInputStream fluent API。也許有設置InputStream的錯誤?也許嘗試使用.WithInputStream API代替

+0

我試過這樣做,但沒有結果。自從切換到PostsFile屬性後,我還沒有嘗試重置位置,但現在會嘗試。 – Jeff

+0

你的猜測並不存在,但他們確實讓我走上了正確的道路。事實證明,在大多數情況下,上傳將在同一個文件中被調用兩次。這似乎是問題的原因。更改我的代碼,使上傳只發生一次,解決了問題。 – Jeff

+0

我很高興你明白了!感謝您的答案! – JMarsch

0

您正在使用哪個流?您正在使用的流是否支持mark()和reset()方法。

可能是上傳的方法先爲給定的流計算MD5然後上傳它,所以如果你的流不支持這兩種方法,那麼在MD5計算時它達到了eof然後無法爲流來上傳對象。

+0

我正在使用包含FileUpload控件中的文件的Stream。 – Jeff