我正在将文件从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
我不需要将文件存储在后端本地系统中,因为我想将此文件发送到Angular 5前端,用户可以在其中将其保存在本地系统中。我收到以下错误
UnicodeDecodeError:“ utf-8”编解码器无法解码位置中的字节0xff 0:无效的起始字节。
有人可以建议我在短时间内下载大文件的正确方法吗?
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});
}
答案 0 :(得分:1)
要从unicode错误开始,原因是:
HttpResponse。初始化(content =”,content_type = None,status = 200, 原因=无,字符集=无)
实例化HttpResponse 具有给定页面内容和内容类型的对象。content应该是迭代器或字符串。如果是迭代器 应该返回字符串,这些字符串将被连接到 形成响应的内容。如果不是迭代器或 字符串,将在访问时转换为字符串。
我确实相信django无法将文件中的二进制数据转换为字符串。处理文件下载时,一种更常见的方法是:
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')