【发布时间】:2015-09-11 00:15:10
【问题描述】:
我四处寻找解决问题的方法,但似乎没有人瞄准我想要实现的目标。
我的问题是这样的,我将 Zip 文件存储在 Azure Blob 存储中,现在为了安全起见,我们有一个 API2 控制器操作来配置这些 zip 文件,而不是允许直接下载。此操作将检索 blob,并将其下载到流中,以便可以将其打包在 HTTPResponseMessage 中。
以上所有方法都有效,但是,当我尝试重新创建 zip 文件时,我被告知它已损坏。现在我只是试图让服务器(在 localhost 上运行)创建 zip 文件,而最终目标是让远程客户端应用程序执行此操作(我相当确定我在服务器上的问题的解决方案是相同的.
public class FileActionResult : IHttpActionResult
{
private HttpRequestMessage _request;
private ICloudBlob _blob;
public FileActionResult(HttpRequestMessage request, ICloudBlob blob)
{
_request = request;
_blob = blob;
}
public async Task<HttpResponseMessage> ExecuteAsync(System.Threading.CancellationToken cancellationToken)
{
var fileStream = new MemoryStream();
await _blob.DownloadToStreamAsync(fileStream);
var byteTest = new byte[fileStream.Length];
var test = fileStream.Read(byteTest, 0, (int)fileStream.Length);
try
{
File.WriteAllBytes(@"C:\testPlatFiles\test.zip", byteTest);
}
catch(ArgumentException ex)
{
var a = ex;
}
var response = _request.CreateResponse(HttpStatusCode.Accepted);
response.Content = new StreamContent(fileStream);
response.Content.Headers.ContentLength = _blob.Properties.Length;
response.Content.Headers.ContentType = new MediaTypeHeaderValue(_blob.Properties.ContentType);
//set the fileName
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = _blob.Name,
Size = _blob.Properties.Length
};
return response;
}
}
我查看了 Zip 库,看看是否存在将 zip 流转换回 zip 文件的解决方案,但我能找到的只是将 zip 文件读入流,或创建以提供文件下载而不是文件创建。
任何帮助将不胜感激,谢谢。
【问题讨论】:
-
它是否取决于 zip 文件的大小?如果您尝试使用小于 1 Mb 的小 zip 文件,您还有问题吗?你也可以尝试做 fileStream.ToArray() 它会给你一个 byte[] arryay 与你的流的内容。
-
@AlexShapovalov 好的,所以 .ToArray() 对我有用,基本上我的问题是 filestream.Read 工作不正常,它写入了正确的字节数,但它们的值都是0. ToArray() 创建相同大小的 Byte 数组,但字节实际上有值。我的下一个问题是,在我的客户端上,流是 WebConnectionStream,因此将其转换为 MemoryStream 可能会更麻烦,但我现在就开始吧! :)
标签: c# azure zip azure-blob-storage memorystream