![](/img/trans.png)
[英]how to zip files from url and then return zip file as response in flask
[英]How to receive a zip file from a HTTP response
语境
总而言之,我有一个应用程序将一些文件或 JSON 发送到 Django 服务器,然后服务器处理该文件并创建一个新的 zip 文件。 这个 zip 文件必须返回到应用程序。 我正在尝试仅使用 POST 请求来执行此操作,将文件作为响应返回。 我能够下载该文件作为 Postman 的响应,并且我还可以在 HttpErrorResponse 属性之一中看到我想要的响应。 我还找到了一个可以做同样事情的答案,但在 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 文件的内容。
我看到一些答案,比如这个和这个,建议添加{ responseType: 'blob' }
或{ responseType: 'text' }
。 东这我收到另一个错误:
错误号 2 -> 415 Unsupported Media Type
尝试将 requestType 作为'application/zip'
或'application/octet-stream'
返回错误号 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
,但没有成功,如下所示:
然后我尝试遵循一些建议,但没有成功:
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 � �
您可以使用请求模块从 url 获取 zip 文件
import requests
url = 'https://www2.census.gov/geo/tiger/GENZ2017/shp/cb_2017_02_tract_500k.zip'
target_path = 'alaska.zip'
response = requests.get(url, stream=True)
handle = open(target_path, "wb")
for chunk in response.iter_content(chunk_size=512):
if chunk: # filter out keep-alive new chunks
handle.write(chunk)
handle.close()
这里的 zip 是从 url 下载并提供的,并将保存在名为 'alaska.zip' 的目录中。
除了是你可以访问这个答案
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.