2010-05-25 33 views
18

Khi tôi tải lên tệp hình ảnh lên một đốm màu, hình ảnh được tải lên thành công rõ ràng (không có lỗi). Khi tôi đến studio lưu trữ đám mây, tệp có ở đó, nhưng với kích thước là 0 (không) byte.Lưu trữ Azure: Các tệp đã tải lên có kích thước bằng không byte

Sau đây là đoạn code mà tôi đang sử dụng:

// These two methods belong to the ContentService class used to upload 
// files in the storage. 
public void SetContent(HttpPostedFileBase file, string filename, bool overwrite) 
{ 
    CloudBlobContainer blobContainer = GetContainer(); 
    var blob = blobContainer.GetBlobReference(filename); 

    if (file != null) 
    { 
     blob.Properties.ContentType = file.ContentType; 
     blob.UploadFromStream(file.InputStream); 
    } 
    else 
    { 
     blob.Properties.ContentType = "application/octet-stream"; 
     blob.UploadByteArray(new byte[1]); 
    } 
} 

public string UploadFile(HttpPostedFileBase file, string uploadPath) 
{ 
    if (file.ContentLength == 0) 
    { 
     return null; 
    } 

    string filename; 
    int indexBar = file.FileName.LastIndexOf('\\'); 
    if (indexBar > -1) 
    { 
     filename = DateTime.UtcNow.Ticks + file.FileName.Substring(indexBar + 1); 
    } 
    else 
    { 
     filename = DateTime.UtcNow.Ticks + file.FileName; 
    } 
    ContentService.Instance.SetContent(file, Helper.CombinePath(uploadPath, filename), true); 
    return filename; 
} 

// The above code is called by this code. 
HttpPostedFileBase newFile = Request.Files["newFile"] as HttpPostedFileBase; 
ContentService service = new ContentService(); 
blog.Image = service.UploadFile(newFile, string.Format("{0}{1}", Constants.Paths.BlogImages, blog.RowKey)); 

Trước khi các tập tin hình ảnh được tải lên kho chứa hàng, InputStream Property từ HttpPostedFileBase dường như là tốt (kích thước của hình ảnh tương ứng với những gì được mong đợi! Và không có ngoại lệ nào được ném ra).

Và điều thực sự lạ là điều này hoạt động hoàn hảo trong các trường hợp khác (tải lên Power Points hoặc thậm chí các hình ảnh khác từ vai trò Công nhân). Mã gọi phương thức SetContent có vẻ giống hệt và tệp có vẻ chính xác vì tệp mới có byte không được tạo tại vị trí chính xác.

Có ai có bất kỳ đề xuất nào không? Tôi đã sửa mã này hàng chục lần và tôi không thể thấy được vấn đề. Bất kỳ đề xuất được hoan nghênh!

Cảm ơn

Trả lời

43

Thuộc tính Chức vụ của InputStream của HttpPostedFileBase có giá trị tương tự như tài sản Chiều dài (có lẽ vì tôi đã có một tập tin trước đó với trang này - ngu ngốc tôi nghĩ).

Tất cả những gì tôi phải làm là đặt thuộc tính Vị trí về 0 (không)!

Tôi hy vọng điều này sẽ giúp ai đó trong tương lai.

+6

Để làm rõ hơn một chút, khi bạn đang làm việc với một Stream, kiểm tra để chắc chắn rằng bạn thiết lập thuộc tính Chức vụ của dòng 0 sau khi bạn nạp bất kỳ byte nào vào đó. Theo mặc định, Vị trí của luồng sẽ được đặt ở cuối nội dung của luồng vì một số lý do. – Dusda

+0

Vâng, đó là điều mà tôi luôn ý thức và tôi không bao giờ mất hơn một giây để nhớ nó. Cảm ơn! –

+0

Nó đã làm, cảm ơn :) –

15

Cảm ơn Fabio đã đề cập và giải quyết câu hỏi của riêng bạn. Tôi chỉ muốn thêm mã vào bất cứ điều gì bạn đã nói. Đề xuất của bạn làm việc hoàn hảo cho tôi.

 var memoryStream = new MemoryStream(); 

     // "upload" is the object returned by fine uploader 
     upload.InputStream.CopyTo(memoryStream); 
     memoryStream.ToArray(); 

// After copying the contents to stream, initialize it's position 
// back to zeroth location 

     memoryStream.Seek(0, SeekOrigin.Begin); 

Và bây giờ bạn đã sẵn sàng để tải lên MemoryStream sử dụng:

blockBlob.UploadFromStream(memoryStream); 
Các vấn đề liên quan