首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从HDFS通过Django后端向角5前端发送数据?

如何从HDFS通过Django后端向角5前端发送数据?
EN

Stack Overflow用户
提问于 2018-08-18 06:09:13
回答 1查看 735关注 0票数 1

我正在从Hadoop下载文件到Django后端,并使用以下代码存储该文件:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

角:

代码语言:javascript
复制
  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});

  }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-18 06:25:07

首先是unicode错误,因为:

HttpResponse.init(content='',content_type=None,status=200,reason=None,charset=None) 实例化具有给定页面内容和内容类型的HttpResponse对象。 内容应该是迭代器或字符串。如果它是一个迭代器,它应该返回字符串,这些字符串将被连接在一起,形成响应的内容。如果它不是迭代器或字符串,则在访问时它将被转换为字符串。

我确实认为django在将文件中的二进制数据转换为string时遇到了问题。在处理文件下载时,一种更常见的方法是:

代码语言:javascript
复制
 response = HttpResponse(content_type="application/jpeg")
 response.write(binary_data)

这是因为在后台调用make_bytes可以正确处理二进制数据。

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

不能这么做因为你想要认证你说的?好的,不如检查身份验证,然后发送如下所示的HttpResponseDirect:

代码语言:javascript
复制
return HttpResponseRedirect('http://112.138.0.12:9870/webhdfs/v1/user/' + user_name + '/1.jpg?op=OPEN&user.name=username')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51905808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档