我有一个简单的应用程序,我正在使用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>
答案 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);
}