我的要求是使用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时,我看到File的内容如下所示。它不包含Response.Content值.PS我有还尝试了MIME类型“application / octet-stream”。没有运气!)
Test.zip又名test.bin的内容:
{&#34;版本&#34; {&#34;主要&#34;:1,&#34;轻微&#34;:1,&#34;建立&#34;: - 1,&#34;修订& #34;: - 1,&#34; majorRevision&#34;: - 1,&#34; minorRevision&#34; - 1},
&#34;内容&#34; {&#34;头&#34;:[{&#34;键&#34;:&#34;内容类型&#34;&#34;值&#34 ;: [&#34;应用程序/压缩&#34;]},
{&#34;键&#34;:&#34;内容处置&#34;&#34;值&#34;:[&#34;附件;文件名= test.zip&#34;]}]},
&#34;的StatusCode&#34;:200,&#34; reasonPhrase&#34;:&#34; OK&#34;&#34;头&#34;:[],&#34; isSuccessStatusCode&#34 ;:真}
有人可以帮助我如何设置result.Content与MemoryStream对象(我在谷歌的其他地方看到了“FileStream”的例子来设置“result.Content”但我只想使用MemoryStream对象! )。 我正在强调这一点,因为我认为问题在于将MemoryStream对象设置为result.Content(为了将流内容正确保存到result.Content对象中)
附:我也通过了Uploading/Downloading Byte Arrays with AngularJS and ASP.NET Web API(以及其他一些链接),但它对我帮助不大...... :(
任何帮助是极大的赞赏。非常感谢提前:)
答案 0 :(得分:0)
我的问题解决了!!
我所做的只是将响应类型更改为HttpResponseMessage并在最后一行使用“return result”而不是Ok(result){即HttpResponseMessage类型而不是OKNegiotatedContentResult类型)