我认为在身份验证/权限服务后保存在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并正确打开。 当通过浏览器(Firefox或Chrome)下载时,文件是7.0MB且已损坏(没有正确的jpegs标头,应该从两个特定字节开始)从curl下载或wget文件是3.7MB并正确打开
以下是curl使用curl -v
输出的响应字段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
答案 0 :(得分:2)
当我使用nginx + uwsgi时问题解决了。我认为它与一些'逐跳'标题有关,如果我手动添加它们,django的runserver拒绝添加和错误输出。这通常与反向代理相关。
答案 1 :(得分:0)
这通常是在通过FTP将文件/数据作为ASCII文件传输类型上传时引起的。 &#34; ASCII传输类型&#34;将文件作为常规文本文件传输,所以没有问题。 但是,&#34;二进制传输类型&#34;将以二进制模式传输数据,该模式将文件作为二进制数据而不是文本数据处理。 将FTP客户端设置为二进制将阻止您的文件通过ftp传输损坏。有关如何将FTP程序切换为二进制文件,请参阅以下内容。
在这里,您应该尝试使用ASCII格式的二进制数据。