16

Próbuję pobrać plik zip z mojego kontrolera sieci web api. Zwraca plik, ale otrzymuję komunikat, że plik zip jest niepoprawny, gdy próbuję otworzyć. Widziałem inne posty na ten temat, a odpowiedzią było dodanie responseType: "arraybuffer". Nadal nie działa dla mnie. Nie dostaję też żadnych błędów w konsoli.sposób pobierania pliku zip przy użyciu kątowego

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(); 
    }); 

kontroler 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; 
     } 
    } 

Aktualizacja pic

+0

Co zawiera funkcja "saveAs"? – miensol

+0

jest to metoda fileaver.js – texas697

Odpowiedz

13

Myślę, że ustawienie responseType w niewłaściwym miejscu, zamiast tego:

$http.post('/api/apiZipPipeLine/', model) 

Spróbuj tego:

$http.post('/api/apiZipPipeLine/', model, {responseType:'arraybuffer'}) 

Aby uzyskać więcej informacji, zobacz this answer.

+0

, która działała! jednak pliki pdf są uszkodzone? czy muszę zmienić coś w moim kontrolerze api? – texas697

+0

opublikowałem zrzut ekranu wyjątku w moim api. Wiem, że to może być osobne pytanie, ale jeśli mógłbyś rzucić okiem, byłbym wdzięczny za to – texas697

+0

Wygląda na to, że get_Length() nie jest obsługiwany, może najpierw musisz pobrać cały strumień? – Buddy

3

W gruncie rzeczy jesteś dość surowy dodając responseType:'arraybuffer'. Dodanie następującego kodu po otrzymaniu odpowiedzi z ajax spowoduje wyświetlenie pliku do pobrania:

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(); 
Powiązane problemy