【JS/Django】上传下载文件以及转换为URL

需求

前端向后端传递数据,后端接收到数据后将其进行处理,然后返回给前端,前端将其显示在img标签上或者下载下来。

简化一下就是
前端向后端请求–>

前端 后端 请求(携带数据) 响应(数据流) 前端 后端

然后将得到的响应数据转换为URL,不再依赖后端。

实施

前端

主要

使用XMLHttpRequest();对象进行AJAX异步请求。具体他是干什么不再过多介绍,主要说下在此种情况下如何使用。

let xhr = new XMLHttpRequest()
xhr.open('POST', '/path/to/api/', true)//第三个参数:是否采用异步传输
xhr.responseType = 'blob' //响应格式为blob

xhr.onload = function (e) {
	if (this.status === 200) {
		// 将数据以blob格式获取到前端
		let blob = this.response;
		let u = URL.createObjectURL(blob)//将blob转化为blob:xxxxxxx格式的URL,供前端使用
	}
}
xhr.send(your_data)//开始请求

以上代码实现了:

  • POST
  • 异步请求
  • 发送数据到后端
  • 以Blob格式接收后端传过来的数据
  • 将Blob的数据转化为前端可用的URL

此时就可以将转换后的URLlet u = URL.createObjectURL(blob),引用到各个地方。
比如可以用于imgsrc上:

$('#IMAGE_ID').attr('src', u) //基于jQuery实现,将ID为IMAGE_ID的img标签的src置为u
其他

可以使用let form_data = new FormData()来创建一个form表单进行数据传输,具体使用如下:

form_data.append('name1', String_Or_BLob_Data1)
form_data.append('name2', String_Or_BLob_Data2);
form_data.append('name3', String_Or_BLob_Data3);
form_data.append('name4', String_Or_BLob_Data4);
form_data.append('csrfmiddlewaretoken', csrf_key)//针对Django

然后

xhr.send(form_data)//开始请求

关于如何获取crsf_key在这篇文章中查看。

后端

主要

后端采用Django实现。
如果前端发送的既有文件、Blob又有字符串,在后端可分别使用

request.POST[name]//正儿八经的字符串数据
request.FILES.get(name)//歪儿玖经的文件数据

如果拿到的是字符串数据,那甭说了,想咋处理就咋处理,玩弄其于股掌之中。
如果拿到的是文件、Blob数据,诶?这就有的说了,可以将其写入到file-like对象中,比如fileBytesIOStringIO

'''BytesIO'''
with BytesIO() as f:
    for chunk in obj.chunks():
        f.write(chunk)
    f.seek(0)

'''File'''
with open('path/to/file', 'w') as f:
    for chunk in obj.chunks():
        f.write(chunk)

接下来可以将拿到的file-like对象进行一些处理,最后将结果给前端响应,如果是字符串格式的响应数据,可以直接发送

return HttpResponse('Something you wanna send to you front-end')

如果是BytesIO数据:

return HttpResponse(obj.getvalue())

如果是file数据

return HttpResponse(obj.read())
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值