gpt4 book ai didi

python - 如何通过 Django 后端将数据从 HDFS 发送到 Angular 5 前端?

转载 作者:行者123 更新时间:2023-12-01 09:07:46 24 4
gpt4 key购买 nike

我正在从 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' codec can't decode byte 0xff in position 0: invalid start byte.

有人可以建议我在短时间内下载大文件的正确方法是什么吗?

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

Angular :

  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});

}

最佳答案

首先,您的 unicode 错误是因为:

HttpResponse.init(content='', content_type=None, status=200, reason=None, charset=None)
Instantiates an HttpResponse object with the given page content and content type.

content should be an iterator or a string. If it’s an iterator, it should return strings, and those strings will be joined together to form the content of the response. If it is not an iterator or a string, it will be converted to a string when accessed.

我确实相信 django 在将文件中的二进制数据转换为字符串时遇到问题。处理文件下载时更常见的方法是:

 response = HttpResponse(content_type="application/jpeg")
response.write(binary_data)

这是有效的,因为在幕后有一个对 make_bytes 的调用,可以正确处理二进制数据。

话虽如此,这并不是最有效的方法。您的 Web 应用程序使用 requests 向远程服务器发出请求,然后将其传递到客户端。为什么不让你的 Angular 代码直接从端点获取数据?

不能这样做,因为你说需要身份验证?好的,检查身份验证然后发送 HttpResponseDirect 怎么样:

return HttpResponseRedirect('http://112.138.0.12:9870/webhdfs/v1/user/' + user_name + '/1.jpg?op=OPEN&user.name=username')

关于python - 如何通过 Django 后端将数据从 HDFS 发送到 Angular 5 前端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51905808/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com