【发布时间】:2019-12-11 10:16:23
【问题描述】:
上下文
总之,我有一个应用程序将一些文件或 JSON 发送到 Django 服务器,然后服务器处理文件并创建一个新的 zip 文件。此 zip 文件必须返回到应用程序。我正在尝试仅使用 POST 请求来执行此操作,并将文件作为响应返回。我能够下载该文件作为 Postman 的响应,并且我还可以在 HttpErrorResponse 属性之一中看到我想要的响应。我也 found an answer 能够做到这一点,但在 Java 中。
一些信息
应用程序:使用 Ionic v4 | 制作服务器:Django 2.2.4
正面尝试
主要请求方式:
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Accept': 'application/json',
}),
requestType: 'application/octet-stream'
};
this.http.post("http://127.0.0.1:8000/converter2/", file, httpOptions)
.pipe(
finalize(() => {
loader.dismiss();
})
)
.subscribe(data => {
console.log(data['body']);
}, error => {
console.log(error);
console.log(error.error.text)
});
尝试:
使用上述方法我收到此错误:
错误号 1 -> SyntaxError: Unexpected token P in JSON at position 0 at JSON.parse
我收到此错误是因为默认情况下,http 响应正在尝试解析响应。我看了HttpClient的文档,但是关于接收zip文件就不多说了。
我看到一些答案,比如this one 和this too,建议添加{ responseType: 'blob' } 或{ responseType: 'text' }。东这个我收到另一个错误:
错误号 2 -> 415 Unsupported Media Type
尝试以'application/zip' 或'application/octet-stream' 发送requestType 返回错误号1。我还尝试将“接受”更改为这些值,结果是:
错误号 3 -> 406 Could not satisfy the request Accept header
如前所述,我可以通过console.log(error.error.text)访问zip文件,但我想正确接收它,而不是作为错误。
服务器端尝试
主要响应方式:
# Return processed file
zip_file = open(zipfiles_folder + 'myfile.zip', 'rb')
return_response = HttpResponse(zip_file, content_type='application/force-download')
return_response['Content-Disposition'] = 'attachment; filename="%s"' % 'myfile.zip'
return return_response
尝试:
现在我尝试更改响应content_type,但没有成功,如下:
- content_type='application/zip'
- content_type='application/octet-stream'
然后我尝试follow some suggestions,再次没有成功:
zip_file = open(zipfiles_folder + 'myfile.zip', 'rb')
return_response = HttpResponse(zip_file, content_type='application/force-download')
return_response['Content-Disposition'] = 'attachment; filename="%s"' % 'myfile.zip'
return_response['Content-Description'] = 'File Transfer'
return_response['Content-Transfer-Enconding'] = 'binary'
return return_response
ZIP 响应(不完全是这样,但非常相似):
PK B�O<�'� � filename.shp '
N� `�_I�*-!L��;� `�YI�ޞ�b��;�
`�YI�ޞ�b��;�
`�_I�*-!L��;�PK B�O�f#t t filename.shx '
:� `�_I�*-!L��;� `�YI�ޞ�b��;� 2
@
PK B�Opk��Z Z filename.dbfw A W FID N
0 1PK B�O�Z�� � filename.prjPROJCS["SIRGAS_2000_UTM_Zone_22S",GEOGCS["GCS_SIRGAS_2000",DATUM["D_SIRGAS_2000",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",10000000.0],PARAMETER["Central_Meridian",-51.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]PK B�O<�'� � �� filename.shpPK B�O�f#t t ��� filename.shxPK B�Opk��Z Z ��d filename.dbfPK B�O�Z�� � ��� filename.prjPK � �
【问题讨论】:
-
你解决了这个@leonardofmed 吗?我遇到了类似的问题,研究了 5 小时后仍未找到解决方案
-
很遗憾没有,经过几天的尝试寻找解决方案,我最终优先考虑了其他功能,再也没有回到这个问题。如果你找到了,请在这里分享。
-
好的,我解决了。我的问题是我在将文件写入 zip 文件时添加了
zipfile.ZIP_DEFLATED标志。似乎这可能是您的问题,因为您的 ZIP 响应看起来您的二进制文件实际上是一个文件夹而不是 zip 文件。检查我所说内容的一种方法是从邮递员那里生成请求,然后点击“保存响应”>“保存到文件”。然后它将在您的磁盘中显示为一个文件夹,在这种情况下,我们会遇到同样的问题。 -
您是否尝试过如下响应格式? var reqOption = { headers: { --- }, responseType: 'arraybuffer' };
标签: python django ionic-framework httpresponse