2016-03-16 3 views
1

У меня проблема с вызовом API для моего метода загрузки.Скачивание файла с помощью API не работает

Вот код JS я использую, он используется с нокаута:

self.downloadFile = function(file) { 
    // Ajax Call Get All Leave Records 
    $.ajax({ 
     type: "POST", 
     url: "/api/v1/CompanyFilesApi/DownloadFile", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     data: ko.toJSON(file), 
     success: function (data) { 
      console.log("Here is your file"); 
     }, 
     error: function (error) { 

      alert(error.status + " <--and--> " + error.statusText); 
     } 
    }); 
    // Ends Here 
}; 

А вот мой API решение:

public HttpResponseMessage DownloadFile(FileModel file) 
    { 
     var path = file.FilePath; 
     var result = Request.CreateResponse(HttpStatusCode.OK, file.FileName); 
     var stream = new FileStream(path, FileMode.Open, FileAccess.Read); 
     result.Content = new StreamContent(stream); 
     result.Content.Headers.ContentType = 
      new MediaTypeHeaderValue("application/octet-stream"); 
     return result; 
    } 

Параметр Файл содержит путь и имя файла.

Может ли кто-нибудь сказать мне, что я делаю неправильно?

Ответ всегда в порядке, но он переходит в ветвь ошибки, и файл не открывается. Файлы - это PDF, Excel, Word.

+0

Ваш api возвращает поток октетов, но ваш вызов ajax ожидает тип данных: json – phenxd

+0

Хорошо, я вижу вашу точку. Я внес изменения, теперь он не идет на ветвь ошибки, но все же файл не загружен/сохранен. Как я могу это сделать? – Vlad

+0

Что находится в вашем объекте данных? – phenxd

ответ

0

EDIT 2:

Вы можете использовать TARGET = «_blank» вместо загрузки, чтобы открыть PDF-файл в новой вкладке.

Для modifify 'A' тег:

$("#your-a-tag-id").attr("href", "data:application/octet-stream;base64," + fileDataString); 

EDIT: Это также может помочь вам link


Одно решение было бы закодировать в base64 и использовать его как таковой:

... 
dataType: "application/octet-stream;base64" 
... 

затем поместить данные отклика в HREF

<a href="data:application/octet-stream;base64,/*YOUR FILE DATA*/" download="your filename"> 

Я не знаю, как справиться с этим в вашем API, хотя.

+0

Я не знаю, можно ли даже поместить данные в разметку после ответа. Это? И другое, думаю, я не использую html5-разметку «загрузка», потому что она не поддерживается старыми браузерами, например. IE8 – Vlad

+0

см. В редакции 2 – phenxd

+0

Я попробую вам новый ответ и вернусь с более подробной информацией. Tnx – Vlad

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