我正在从Hadoop下载文件到Django后端,并使用以下代码存储该文件:
import shutil
import requests
url = 'http://112.138.0.12:9870/webhdfs/v1/user/username/1.jpg?op=OPEN&user.name=username'
response = requests.get(url, stream=True)
with open('img.png', 'wb') as out_file:
shutil.copyfileobj(response.raw, out_file)
del response我不需要将该文件存储在后端本地系统中,因为我希望将该文件发送到角5前端,用户将在其本地系统中保存该文件。我得到了以下错误
UnicodeDecodeError:'utf-8‘编解码器无法解码0位置的字节0 0xff :无效的开始字节。
有人能建议我在短时间内下载大文件的正确方法吗?
DJANGO:
views.py:
class DownloadFileView(GenericAPIView):
serializer_class = UserNameSerializer
def get(self, request):
key = request.META.get('HTTP_AUTHORIZATION').split()[1]
user_id = Token.objects.get(key=key).user_id
user_name = User.objects.get(id=user_id).username
response = download_files(user_name)
return Response(response)
def download_files(user_name):
response = requests.get('http://112.138.0.12:9870/webhdfs/v1/user/' + user_name + '/1.jpg?op=OPEN&user.name=username', stream=True)
return response.raw角:
DownloadFile(){
this.userService.DownloadFiles().subscribe((data : any) => {
const blob = new Blob([data], { type: 'application/octet-stream'});
fileUrl = this.sanitizer.bypassSecurityTrustResourceUrl(window.URL.createObjectURL(blob));
}
}
DownloadFiles() {
this.token = localStorage.getItem('userToken')
var reqHeader = new HttpHeaders({ 'Content-Type': 'application/octet-stream', 'Authorization': 'token ' + this.token });
console.log(reqHeader)
return this.http.get(this.rootURL + 'download/', { headers: reqHeader});
}发布于 2018-08-18 06:25:07
首先是unicode错误,因为:
HttpResponse.init(content='',content_type=None,status=200,reason=None,charset=None) 实例化具有给定页面内容和内容类型的HttpResponse对象。 内容应该是迭代器或字符串。如果它是一个迭代器,它应该返回字符串,这些字符串将被连接在一起,形成响应的内容。如果它不是迭代器或字符串,则在访问时它将被转换为字符串。
我确实认为django在将文件中的二进制数据转换为string时遇到了问题。在处理文件下载时,一种更常见的方法是:
response = HttpResponse(content_type="application/jpeg")
response.write(binary_data)这是因为在后台调用make_bytes可以正确处理二进制数据。
话虽如此,但这并不是最有效的方法。您的web应用程序使用请求向远程服务器发出请求,然后将请求传递给客户端。为什么不让你的角度代码直接从端点获取数据呢?
不能这么做因为你想要认证你说的?好的,不如检查身份验证,然后发送如下所示的HttpResponseDirect:
return HttpResponseRedirect('http://112.138.0.12:9870/webhdfs/v1/user/' + user_name + '/1.jpg?op=OPEN&user.name=username')https://stackoverflow.com/questions/51905808
复制相似问题