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

时间:2018-08-18 06:09:13

标签: python django angular django-rest-framework angular5

我正在将文件从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});

  }

1 个答案:

答案 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')