我的问题是我在客户端获取了错误大小的文件。这是我的@Controller ......
#undef'ed
...这是我使用angular-file-saver的客户端代码...
XYZ
原始文件是935673字节,但response.data是900728,并通过转换到Uint8Array,导致Blob的大小也是900728。无论哪种方式,生成的保存文件都是900728字节(害羞34945字节)。写入的内容也不尽相同。它看起来有点臃肿,但最后一部分似乎被截断了。我可能做错了什么想法?
更新
我刚刚将控制器方法更新为以下内容并得到了完全相同的结果。哎呀。
@RequestMapping(value = "/download/{id}", method = RequestMethod.GET)
public ResponseEntity<?> download(final HttpServletRequest request,
final HttpServletResponse response,
@PathVariable("id") final int id) throws IOException {
try {
// Pseudo-code for retrieving file from ID.
Path zippath = getZipFile(id);
if (!Files.exists(zippath)) {
throw new IOException("File not found.");
}
ResponseEntity<InputStreamResource> result;
return ResponseEntity.ok()
.contentLength(Files.size(zippath))
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(new InputStreamResource(new FileInputStream(zippath.toFile())));
} catch (Exception ex) {
// ErrorInfo is another class, unimportant
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ErrorInfo(ex));
}
}
答案 0 :(得分:4)
所以问题原来是angular的$ http服务。我也试过jQuery的ajax方法。两者都给出了相同的结果。如果我改为使用原生XMLHttpRequest,它可以正常工作。所以Java代码是健全的。我首先通过直接将文件暴露给互联网来验证这一点,然后使用curl并直接在浏览器中访问我设法下载了正确大小的文件。然后我找到了这个解决方案,这样我也可以通过javascript下载文件。
var state = 'CA';
var year = 2014;
var url = ' https://taxee.io/api/v1/state/'+year+'/'+state;
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", url, true);
xmlhttp.onload = function() {
var result = JSON.parse(this.responseText);
console.log(result.single.income_tax_brackets);
xmlhttp.abort();
}
xmlhttp.send();
为什么angular或jQuery会给出错误的结果?我仍然不知道,但如果有人希望给出一个使用它的答案,那将是值得赞赏的。
答案 1 :(得分:1)
responseType:blob 做了拉链文件的技巧
Angular 2 +
this.http.get('http://localhost:8080/export', { responseType: ResponseContentType.Blob })
.subscribe((res: any) => {
const blob = new Blob([res._body], { type: 'application/zip' });
saveAs(blob, "fileName.zip");
答案 2 :(得分:0)
我偶然发现了&#39; responseType&#39;在$ http请求中,您可能正在寻找&#39; blob&#39;:https://docs.angularjs.org/api/ng/service/ $ http#usage