J'essaie de télécharger un fichier Zip depuis mon contrôleur web api. Il renvoie le fichier mais je reçois un message indiquant que le fichier zip n'est pas valide lorsque j'essaie de l'ouvrir. J'ai vu d'autres articles à ce sujet et la réponse a ajouté le responseType: 'arraybuffer'. Ça ne marche toujours pas pour moi. Je ne reçois aucune erreur dans la console non plus.
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();
});
contrôleur 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;
}
}
Mise à jour
Je pense que vous définissez le responseType au mauvais endroit, au lieu de cela:
$http.post('/api/apiZipPipeLine/', model)
Essaye ça:
$http.post('/api/apiZipPipeLine/', model, {responseType:'arraybuffer'})
Jetez un oeil à cette réponse pour plus de détails.
En fait, vous êtes juste d'ajouter responseType:'arraybuffer'
. Cela ajouté au code suivant lors de la réception de la réponse d'ajax demandera un fichier à télécharger:
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();