【问题标题】:How to receive a zip file from a HTTP response如何从 HTTP 响应接收 zip 文件
【发布时间】: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 onethis 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,但没有成功,如下:

  1. content_type='application/zip'
  2. 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


【解决方案1】:

您可以使用请求模块从 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' 的目录中。

除了你还可以访问这个answer

【讨论】:

  • 感谢您的回答,但我不需要从任何地方获取 zip。我已经在服务器中创建了我需要的那个。我只想将其作为响应发送回应用程序,而不是作为新请求。
  • 你可以做类似 response = HttpResponse(output.getvalue(), mimetype='application/zip') response['Content-Disposition'] = 'attachment; filename="yourzipfilename.zip"' 返回响应link 看看
  • 如果您在我的帖子中看到我的“主要响应方法”,您会发现这正是我所做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多