16

Я пытаюсь загрузить zip-файл с моего веб-контроллера api. Он возвращает файл, но я получаю сообщение, что zipfile недействителен, когда я пытаюсь открыть. Я видел другие сообщения об этом, и в ответ добавлялось responseType: 'arraybuffer'. Все еще не работает для меня. Я также не получаю никаких ошибок в консоли.Как скачать zip-файл с помощью углового

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

контроллер апи

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

Update pic

+0

Что находится в функции 'saveAs'? – miensol

+0

это файл.avi способ – texas697

ответ

13

Я думаю, что вы устанавливаете responseType в неправильном месте, вместо этого:

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

Попробуйте это:

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

Посмотрите на this answer для получения более подробной информации.

+0

это сделал работа! однако pdf-файлы повреждены? мне нужно что-то изменить в моем контроллере api? – texas697

+0

Я разместил скриншот исключения в моей api. Я знаю, что это может быть отдельный вопрос, но если вы, если можете взглянуть, я был бы признателен – texas697

+0

Похоже, что get_Length() не поддерживается, возможно, вам нужно сначала загрузить весь поток? – Buddy

3

На самом деле вы добавили 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(); 

 Смежные вопросы

  • Нет связанных вопросов^_^