Web API - 使用 byte[] / MemoryStream 内容设置 Response.Content 无法正常工作
Web API - Setting Response.Content with byte[] / MemoryStream Contents not working properly
我的要求是使用WebAPI通过网络发送一个zip文件(依次包含一堆文件),该文件不应写在本地任何地方(不要写在server/client 磁盘)。对于压缩,我使用的是 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 值。P.S。我也尝试过 MIME 类型“application/octet-stream”。不走运!)
Test.zip 又名 test.bin 的内容:
{"version":{"major":1,"minor":1,"build":-1,"revision":-1,"majorRevision":-1 ,"minorRevision":-1},
"content":{"headers":[{"key":"Content-Type","value":["application/zip"]},
{"key":"Content-Disposition","value":["attachment; filename=test.zip"]}]},
"statusCode":200,"reasonPhrase":"OK","headers":[],"isSuccessStatusCode":true}
有人可以帮助我如何使用 MemoryStream 对象设置 result.Content(我在 google 的其他地方看到过“FileStream”的示例来设置“result.Content ” 但我只想使用 MemoryStream 对象!)。 我强调这一点是因为我认为问题在于将 MemoryStream 对象设置为 result.Content(以便将流内容正确保存到 result.Content 对象)
P.S。我也浏览了 Uploading/Downloading Byte Arrays with AngularJS and ASP.NET Web API(以及其他一些链接),但对我帮助不大……:(
任何帮助是极大的赞赏。非常感谢:)
我的问题解决了!!
我所做的只是将响应类型更改为 HttpResponseMessage 并在最后一行使用 "return result" 而不是 Ok(result) { 即 HttpResponseMessage 类型而不是 OKNegiotatedContentResult 类型)
我的要求是使用WebAPI通过网络发送一个zip文件(依次包含一堆文件),该文件不应写在本地任何地方(不要写在server/client 磁盘)。对于压缩,我使用的是 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 值。P.S。我也尝试过 MIME 类型“application/octet-stream”。不走运!)
Test.zip 又名 test.bin 的内容:
{"version":{"major":1,"minor":1,"build":-1,"revision":-1,"majorRevision":-1 ,"minorRevision":-1},
"content":{"headers":[{"key":"Content-Type","value":["application/zip"]},
{"key":"Content-Disposition","value":["attachment; filename=test.zip"]}]},
"statusCode":200,"reasonPhrase":"OK","headers":[],"isSuccessStatusCode":true}
有人可以帮助我如何使用 MemoryStream 对象设置 result.Content(我在 google 的其他地方看到过“FileStream”的示例来设置“result.Content ” 但我只想使用 MemoryStream 对象!)。 我强调这一点是因为我认为问题在于将 MemoryStream 对象设置为 result.Content(以便将流内容正确保存到 result.Content 对象)
P.S。我也浏览了 Uploading/Downloading Byte Arrays with AngularJS and ASP.NET Web API(以及其他一些链接),但对我帮助不大……:(
任何帮助是极大的赞赏。非常感谢:)
我的问题解决了!!
我所做的只是将响应类型更改为 HttpResponseMessage 并在最后一行使用 "return result" 而不是 Ok(result) { 即 HttpResponseMessage 类型而不是 OKNegiotatedContentResult 类型)