2017-02-22 76 views
2

Загрузка файла, который отлично подходит для моего приложения, до тех пор, пока я не обновил его до нуля. Даже сейчас файл загружается, но проблема в том, что он поврежден. Файл загрузки работает нормально, и если мы проверим файловый сервер, файл останется нетронутым. Но после загрузки я получаю поврежденный файл.Загруженный документ, поврежденный с использованием метода Blob в angularJS

Html:

<td data-title="''"> 

    <a tooltip="Download CV" ng-hide="!talent.resumePath" tooltip-trigger tooltip-animation="false" tooltip-placement="bottom" ng-click="downloadResume(talent.id)" data-placement="top" data-toggle="tooltip" data-original-title="resume"> 
     <img src="../../img/DownloadIcon.png" /></a> 
</td> 

Контроллер:

downloadResume: function(employeeId) { 
    return apiServices.getFileFromTalentPool('/talentpool/resume?id=' + employeeId) 
}, 

Где getFileFromTalentPool является: https://hastebin.com/yivaterozi.js

Endpoint:

public FileResult GetResume(int id) { 
    var result = _services.GetResume(id); 
    if (result != null) { 
     HttpContext.Response.ContentType = result.ContentType; 
     HttpContext.Response.Headers["Access-Control-Expose-Headers"] = "FileName"; 
     HttpContext.Response.Headers["FileName"] = result.FileDownloadName; 
    } 
    return result; 
} 

Обычно я доу nload Doc-файлы. Я попробовал файл с блокнотом, чтобы убедиться, что это то же самое. Странно, я заметил, что я могу открыть файл блокнота, но его содержимое управляется чем-то вроде [object Object]. Но для файлов Doc он просто показывает http://oi68.tinypic.com/2i11m9y.jpg

Как это исправить?

ответ

3

похоже, что код на https://hastebin.com/yivaterozi.js был обновлен с использованием устаревшего метода $http.success() в настоящее время $http.then(). Promise 'функция обратного вызова (в пределах метода then) получает только один аргумент объекта: https://docs.angularjs.org/api/ng/service/ $ http. В устаревшем методе «успех» появилось больше аргументов (данные, статус, заголовки), а data уже содержит необработанные данные. При использовании then(), данные находятся под data собственности ответа, поэтому постарайтесь изменить свой $http вызов:

$http({ 
    method: 'GET', 
    cache: false, 
    url: fileurl, 
    responseType:'arraybuffer', 
    headers: { 
    'Authorization': "Bearer " + $rootScope.userInfo.access_token, 
    'Access-Control-Allow-Origin': '*' 
    } 
}).then(function (data) { 
    var octetStreamMime = 'application/octet-stream'; 
    var success = false; 

    // Get the headers 
    var headers = data.headers(); 
    ... 
    ... 

Обратите внимание, что заголовки будут выбраны правильно здесь из объекта данных, а не из третьего аргумента (просто добавьте var, так как мы удалили пустые аргументы). Теперь в каждом месте, которое вы используете данные, измените его на data.data, как:

// Try using msSaveBlob if supported 
var blob = new Blob([data.data], { type: contentType }); 

или просто изменить аргумент данные в ответ и добавить var data = response.data; НФА изменить заголовки добытчика к headers = response.headers(); :

$http({ 
    method: 'GET', 
    cache: false, 
    url: fileurl, 
    responseType:'arraybuffer', 
    headers: { 
    'Authorization': "Bearer " + $rootScope.userInfo.access_token, 
    'Access-Control-Allow-Origin': '*' 
    } 
}).then(function (response) { 
    var octetStreamMime = 'application/octet-stream'; 
    var success = false; 

    // Get data 
    var data = response.data; 

    // Get the headers 
    var headers = response.headers(); 
    ... 
    ... 
+0

Большое спасибо. Это работало как шарм! :) – Phoenix