Web APIコントローラーからZipファイルをダウンロードしようとしています。ファイルを返していますが、開こうとするとzipファイルが無効であるというメッセージが表示されます。私はこれについて他の投稿を見ましたが、応答にはresponseType: 'arraybuffer'が追加されていました。まだ私のために働いていません。コンソールにもエラーは表示されません。
var model = $scope.selection;
var res = $http.post('/api/apiZipPipeLine/', model)
res.success(function (response, status, headers, config) {
saveAs(new Blob([response], { type: "application/octet-stream", responseType: 'arraybuffer' }), 'reports.Zip');
notificationFactory.success();
});
aPIコントローラー
[HttpPost]
[ActionName("ZipFileAction")]
public HttpResponseMessage ZipFiles([FromBody]int[] id)
{
if (id == null)
{//Required IDs were not provided
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.BadRequest));
}
List<Document> documents = new List<Document>();
using (var context = new ApplicationDbContext())
{
foreach (int NextDocument in id)
{
Document document = context.Documents.Find(NextDocument);
if (document == null)
{
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
}
documents.Add(document);
}
var streamContent = new PushStreamContent((outputStream, httpContext, transportContent) =>
{
try
{
using (var zipFile = new ZipFile())
{
foreach (var d in documents)
{
var dt = d.DocumentDate.ToString("y").Replace('/', '-').Replace(':', '-');
string fileName = String.Format("{0}-{1}-{2}.pdf", dt, d.PipeName, d.LocationAb);
zipFile.AddEntry(fileName, d.DocumentUrl);
}
zipFile.Save(outputStream); //Null Reference Exception
}
}
finally
{
outputStream.Close();
}
});
streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
streamContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
streamContent.Headers.ContentDisposition.FileName = "reports.Zip";
var response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = streamContent
};
return response;
}
}
更新
私はあなたがこれの代わりに間違った場所にresponseTypeを設定していると思います:
$http.post('/api/apiZipPipeLine/', model)
これを試して:
$http.post('/api/apiZipPipeLine/', model, {responseType:'arraybuffer'})
詳細については this answer をご覧ください。
実際のところ、あなたはresponseType:'arraybuffer'
を正確に追加しています。 ajaxから応答を受け取ったときに次のコードに追加されたものは、ダウンロードするファイルを要求します。
var a = document.createElement('a');
var blob = new Blob([responseData], {'type':"application/octet-stream"});
a.href = URL.createObjectURL(blob);
a.download = "filename.Zip";
a.click();