我的要求是使用Web API在网络上发送一个zip文件(依次由一堆文件组成),该文件不应写入本地任何位置(不应写入服务器/客户端磁盘上的任何位置)。对于压缩,我使用DotNetZip-Ionic.Zip.dll
服务器代码:
public async Task<IHttpActionResult> GenerateZip(Dictionary<string, StringBuilder> fileList)
{
// fileList is actually a dictionary of “FileName”,”FileContent”
byte[] data;
using (ZipFile zip = new ZipFile())
{
foreach (var item in filelist.ToArray())
{
zip.AddEntry(item.Key, item.Value.ToString());
}
using (MemoryStream ms = new MemoryStream())
{
zip.Save(ms);
data = ms.ToArray();
}
}
var result = new HttpResponseMessage(HttpStatusCode.OK);
MemoryStream streams = new MemoryStream(data);
//, 0, data.Length-1, true, false);
streams.Position = 0;
//Encoding UTFEncode = new UTF8Encoding();
//string res = UTFEncode.GetString(data);
//result.Content = new StringContent(res, Encoding.UTF8, "application/zip");
<result.Content = new StreamContent(streams);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip");
//result.Content.Headers.ContentLength = data.Length;
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
result.Content.Headers.ContentDisposition.FileName = "test.zip";
return this.Ok(result);
}
我面临的问题是,在客户端下载的zip文件被修改为test.bin后,其流内容(本例中的byte[]数据)丢失。(我正在返回一个test.zip文件。当我在本地将文件从test.zip更改为test.bin时,我看到该文件的内容如下所示。它不包含Response.Content值。附言:我也尝试过MIME类型的"application/octet stream"。运气不好!)
Test.zip又名Test.bin的内容:
{"版本":{"主要":1,"次要":1、"内部版本":-1,"修订":-1、"主要修订":-1、"次要修订":1},
"content":{"headers":[{"key":"content Type","value":["application/zip"]},
{"key":"Content Disposition","value":["attachment;filename=test.zip"]}},
"状态代码":200,"reasonPhrase":"OK","headers":[],"isSuccessStatusCode":true}
有人能帮我制定结果吗。带有MemoryStream对象的内容(我在谷歌上的其他地方看到过"FileStream"设置"result.Content"的例子,但我只想使用MemoryStream!) 我之所以强调这一点,是因为我认为问题在于将MemoryStream对象设置为结果。内容(为了将流内容正确保存到result.Content对象中)
附言:我还通过AngularJS和ASP.NET Web API上传/下载了字节数组(以及其他一些链接),但这对我没有太大帮助…:(非常感谢您的帮助。提前感谢:)
我的问题解决了!!
我所做的只是将响应类型更改为HttpResponseMessage,并在最后一行使用"return result"而不是Ok(result){即HttpResponceMessage类型而不是OKNegiotatedContentResult类型)