python下载文件损坏_python – django二进制文件下载在浏览器中损坏

我认为在身份验证/权限服务后保存在FileField中的文件.

from django.http import StreamingHttpResponse

from rest_framework import viewsets

from rest_framework.decorators import detail_route

from wsgiref.util import FileWrapper

import mimetypes

from myapp.models import MyModel

class ExampleViewSet(viewsets.ViewSet):

# Normal crud (retrive, list, etc.)

@detail_route(methods=['GET'])

def download(self, *args, **kwargs):

pk = self.request.parser_context['kwargs'].get('pk', None)

if pk is None:

raise exceptions.ParseError('no pk')

instance = MyModel.objects.get(pk=pk)

filename = instance.file_field.name.split('/')[-1]

mime = mimetypes.guess_type(filename)[0]

file = instance.file_field.file

response = StreamingHttpResponse(

FileWrapper(open(file, 'rb'), 10240))

response['Content-Type'] = "{0}; charset=utf-8".format(mime)

response['Content-Length'] = file.size

response[

'Content-Disposition'] = 'attachment; filename={0}'.format(filename)

return response

该文件本身是一个3.7MB的文件jpeg,以前由用户上传.在上传目录下,该文件为3.7MB并正确打开.

当从curl或wget下载文件为3.7MB并正确打开时,通过浏览器(Firefox或Chrome)下载文件为7.0MB且已损坏(没有正确的jpeg标头,应以两个特定字节开头)

以下是使用curl -v的响应字段的curl输出

curl -v http://localhost:3000/api/school_admin/posters/7/download?token=ZXlKaGJHY2lPaUpJVXpVeE1pSXNJblI1Y0NJNklrcFhWQ0o5LmV5SndhR0Z6YUNJNkltSmpjbmx3ZEY5emFHRXlOVFlrSkRKaUpERXlKR2hzVlUxd2QyOWpTM1pMTnk1VlRuSXZPR1ZNVWs5aFJEVjBVbmR2V21FeVVGVlZiWGhxTTJWb1UzZFhla1JNU3k5RmFqZFRJaXdpY0hKdlptbHNaVjl3YXlJNk15d2laWGh3SWpveE5EY3lOalUyTWpFMGZRLmV6OGg5SWVwLUozYjdQcHJLVGJCZWlSSjJPN1JRdnItaFVuLVg0dmdLZGdtRGdQV0s2ZzkzdktialN2Uy1EVTVkM1hRc2hRZ3YxeVZmQlJhUDBBVlhB -o test.jpeg

% Total % Received % Xferd Average Speed Time Time Time Current

Dload Upload Total Spent Left Speed

0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Trying 127.0.0.1...

* Connected to localhost (127.0.0.1) port 3000 (#0)

> GET /api/school_admin/posters/7/download?token=ZXlKaGJHY2lPaUpJVXpVeE1pSXNJblI1Y0NJNklrcFhWQ0o5LmV5SndhR0Z6YUNJNkltSmpjbmx3ZEY5emFHRXlOVFlrSkRKaUpERXlKR2hzVlUxd2QyOWpTM1pMTnk1VlRuSXZPR1ZNVWs5aFJEVjBVbmR2V21FeVVGVlZiWGhxTTJWb1UzZFhla1JNU3k5RmFqZFRJaXdpY0hKdlptbHNaVjl3YXlJNk15d2laWGh3SWpveE5EY3lOalUyTWpFMGZRLmV6OGg5SWVwLUozYjdQcHJLVGJCZWlSSjJPN1JRdnItaFVuLVg0dmdLZGdtRGdQV0s2ZzkzdktialN2Uy1EVTVkM1hRc2hRZ3YxeVZmQlJhUDBBVlhB HTTP/1.1

> Host: localhost:3000

> User-Agent: curl/7.43.0

> Accept: */*

>

< HTTP/1.1 200 OK

< date: Mon, 29 Aug 2016 18:31:30 GMT

< server: WSGIServer/0.2 CPython/3.4.3

< allow: GET, DELETE, HEAD, OPTIONS

< content-type: image/jpeg; charset=utf-8

< vary: Accept

< content-length: 3947925

< content-disposition: attachment; filename=poster_28F7bdD4caAbCc583831c9E7C9baDaEC88Ecbde6FBAA6aE71cAdC09fd8EFCF7BD515155bec1C3FC6f01c6FEf5Ba76e41952E_Colosseum_in_Rome_Italy_-_April_2007.jpg

< x-frame-options: SAMEORIGIN

< via: 1.1 fedora

< Connection: keep-alive

<

{ [15913 bytes data]

100 3855k 100 3855k 0 0 141M 0 --:--:-- --:--:-- --:--:-- 144M

* Connection #0 to host localhost left intact

最佳答案 当我使用nginx uwsgi时,问题就解决了.我认为它与一些’逐跳’标题有关,如果我手动添加它们,django的runserver拒绝添加和错误输出.这通常与反向代理相关.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值