次の問題があり、解決策が見つかりません。 Spring Bootを使用してエンドポイントを作成し、 Postman を使用しているときに、ボディリクエストの画像で応答が得られます。
しかし、AngularとBlobとFileSaverを使用してコンピューターにファイルをダウンロードして保存しようとすると、保存したファイルを読み取ることができません。
これは私のangular controller:
vm.download = function (filename) {
console.log("Start download. File name:", filename);
$http.get('api/files/download/' + filename)
.then(function (response) {
console.log(data);
var data = new Blob([response.data], {type: 'image/jpeg;charset=UTF-8'});
FileSaver.saveAs(data, filename);
})
}
ここに私のエンドポイントがあります:
@RequestMapping(value = "/files/download/{id:.*}", method = RequestMethod.GET)
@ResponseBody
@Timed
public void DownloadFiles(@PathVariable String id, HttpServletRequest request, HttpServletResponse response) throws IOException {
MongoClient mongoClient = new MongoClient();
DB mongoDB = mongoClient.getDB("angularspingproject");
BasicDBObject query = new BasicDBObject();
query.put("filename", id);
GridFS fileStore = new GridFS(mongoDB, "fs");
GridFSDBFile gridFSDBFile = fileStore.findOne(query);
if (gridFSDBFile != null && id.equalsIgnoreCase((String) gridFSDBFile.getFilename())) {
try {
response.setContentType(gridFSDBFile.getContentType());
response.setContentLength((new Long(gridFSDBFile.getLength()).intValue()));
response.setHeader("content-Disposition", "attachment; filename=" + gridFSDBFile.getFilename());
IOUtils.copyLarge(gridFSDBFile.getInputStream(), response.getOutputStream());
} catch (IOException e) {
throw new RuntimeException("IOError writting file to output stream");
}
}
}
私のヘッダー:
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Content-Length: 316707
Content-Type: image/jpeg;charset=UTF-8
Pragma: no-cache
Server:Apache-Coyote/1.1
X-Application-Context : angularspingproject:8080
X-Content-Type-Options : nosniff
X-XSS-Protection: 1; mode=block
content-Disposition: attachment; filename=main_page.jpg
@Edit問題解決
vm.download = function (filename) {
$http.get('api/files/download/' + filename, {responseType:'blob'})
.then(function (response) {
console.log(response);
var data = new Blob([response.data], {type: 'image/jpeg;charset=UTF-8'});
FileSaver.saveAs(data, filename);
})
}
ResponseType: 'blob'を$ httpに追加しました
$ http.get呼び出しからバイト配列を取得していないと思います。追加してみてください:
vm.download = function (filename) {
var config = {headers: {
'Accept': "image/jpeg"
}
};
$http.get('api/files/download/' + filename, config).then(function (response) {
var myBuffer= new Uint8Array( response.data );
var data = new Blob([myBuffer], {type: 'image/jpeg;charset=UTF-8'});
FileSaver.saveAs(data, filename);
})
}
angularに特別なダウンロードサービスがあり、非常にうまく機能します。
(function () {
angular.module('common')
.factory('downloadService', ['$http', '$window', 'contentDispositionParser',
function ($http, $window, contentDispositionParser) {
return {
downloadFile: downloadFile
};
function downloadFile(url, request)
{
$http({
url: url,
method: 'GET',
params: request,
responseType: 'blob'
})
.success(function (data, status, headers, config){
var disposition = headers('Content-Disposition');
var filename = contentDispositionParser.getFileName(disposition);
$window.saveAs(data, filename); // This is from FileSaver.js
});
}
}]);
})();
Filesaver.jsは here からのものです。 ContentDispositionParserあなたは何でも使うか自分で書くことができます、それは明らかに簡単なタスクではないので、適切なファイル名を取得するためだけに使用されますが、ファイル自体の保存に直接接続されていません