上传和下载流到Azure Blob

时间:2012-10-10 14:27:18

标签: .net html azure

我有一个简单的应用程序,我正在使用WCF服务的文件类型输入进行表单发布。我正在尝试将该文件从表单帖子上传到Azure blob,然后通过点击相应的blob网址下载它。

现在发生的事情是我正在将文件上传到Azure,但是当我下载文件时,该文件不包含内容。例如,如果我上传something.zip或something.gif我可以从网址下载它,但它们都不会包含任何东西。

我读过这可能是因为流的位置没有设置为0.它不会让我设置下面的Stream“stream”的位置,所以我将它复制到memoryStream。可悲的是,这并没有解决问题。

[OperationContract]
[WebInvoke(Method = "POST",
    BodyStyle = WebMessageBodyStyle.Wrapped,
    RequestFormat = WebMessageFormat.Json,
    ResponseFormat = WebMessageFormat.Json,
    UriTemplate = "Upload")]
public string upload(Stream stream)
{
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
        CloudConfigurationManager.GetSetting("StorageConnectionString"));
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
    CloudBlobContainer container = blobClient.GetContainerReference(exerciseContainer);
    CloudBlob blob = container.GetBlobReference("myblob");

    Stream s = new MemoryStream();
    stream.CopyTo(s);
    s.Seek(0, SeekOrigin.Begin);
    blob.UploadFromStream(s);

    return "uploaded";
}

此外,我知道该文件是通过fiddler / break进入服务的,我已成功通过硬编码上传和下载文件,如下所示:

using (var fileStream = System.IO.File.OpenRead(@"C:\file.zip"))
{
    blob.UploadFromStream(fileStream);
}

编辑: HTML

<form action='http://127.0.0.1:81/service.svc/Upload' method="post">
    <input type="file" name="file" id="btnUpload" value="Upload" />
    <input type="submit" value="Submit" class="btnExercise" id="btnSubmitExercise"/>
</form>

1 个答案:

答案 0 :(得分:4)

您的代码看起来是正确的。但我对你收到的流有疑问。你确定它包含数据吗?你能试试下面的代码吗?它返回上传blob后收到的总字节数。

using (var ms = new MemoryStream())
{
    byte[] buffer = new byte[32768]; 
    int bytesRead, totalBytesRead = 0; 

    do 
    { 
        bytesRead = stream.Read(buffer, 0, buffer.Length); 
        totalBytesRead += bytesRead; 

        ms.Write(buffer, 0, bytesRead); 
    } while (bytesRead > 0); 

    blob.UploadFromStream(ms);

    return String.Format("Uploaded {0}KB", totalBytesRead/1024);
}