- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Django后端分离 使用element-ui文件上传方式由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1:导入element 。
1
2
3
4
5
6
|
<!-- 引入样式 -->
<
link
rel
=
"stylesheet"
href
=
"https://unpkg.com/element-ui/lib/theme-chalk/index.css"
rel
=
"external nofollow"
>
<!-- 引入组件库 -->
<
script
src
=
"https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.min.js"
></
script
>
<!-- 引入Vue -->
<
script
src
=
"https://unpkg.com/element-ui/lib/index.js"
></
script
>
|
2:前端文件 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
css:
.avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.avatar-uploader .el-upload:hover {
border-color: #409EFF;
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 178px;
height: 178px;
line-height: 178px;
text-align: center;
}
.avatar {
width: 178px;
height: 178px;
display: block;
}
html:
{% comment %} 上传图片 {% endcomment %}
<
div
id
=
"profile"
>
<
h1
style
=
"text-align: center"
>更新社团封面</
h1
>
<
div
id
=
"app"
style
=
"text-align: center"
>
<
el-upload
:data
=
"datas"
// 携带的参数
:headers
=
"headers"
// 请求头
name
=
"image"
{% comment %} 后端接收的参数名 {% endcomment %}
class
=
"avatar-uploader"
action
=
"/show/images/"
{% comment %} 上传路由地址 {% endcomment %}
:show-file-list
=
"false"
:on-success
=
"handleAvatarSuccess"
{% comment %} 文件上传成功时的钩子 {% endcomment %}
:before-upload
=
"beforeAvatarUpload"
> {% comment %} 上传文件之前的钩子,参数为上传的文件 {% endcomment %}
<
img
v-if
=
"imageUrl"
:src
=
"imageUrl"
class
=
"avatar"
>
<
i
v-else
class
=
"el-icon-plus avatar-uploader-icon"
></
i
>
</
el-upload
>
</
div
>
</
div
>
{% comment %} 上传图片 {% endcomment %}
# JS:
<
script
>
var Main = {
data() {
return { headers:{}, // 请求头是个对象 datas:{}, // 对象
imageUrl: ''
};
}, create(){
this.headers.authenticate = sessionStorage.getItem('token') // 设置请求头带token
this.datas.data = "userHead" // 设置请求参数
}
methods: {
handleAvatarSuccess(res, file) {
this.imageUrl = URL.createObjectURL(file.raw);
console.log("imageUrl",this.imageUrl)
},
beforeAvatarUpload(file) {
const isJPG = file.type === 'image/jpeg';
const isLt2M = file.size / 1024 / 1024 <
2
;
if (!isJPG) {
this.$message.error('上传头像图片只能是 JPG 格式!');
}
if (!isLt2M) {
this.$message.error('上传头像图片大小不能超过 2MB!');
}
return isJPG && isLt2M;
}
}
}
var
Ctor
=
Vue
.extend(Main)
new Ctor().$mount('#app')
</script>
|
3:后端文件 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
路由:
# 预览图片url("show/images/$", add_image.Image.as_view()),
py文件:
from
rest_framework.views
import
APIView
from
SocietyPlat
import
settings
from
django.shortcuts
import
render, redirect, HttpResponse
from
Databases
import
models
from
django.http
import
JsonResponse
import
os
# 获取相对路径
BASE_DIR
=
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
class
Image(APIView):
def
post(
self
, request):
# 接收文件
file_obj
=
request.FILES.get(
'image'
,
None
) style
=
requetst.data.get(
'data'
)
# 用户名
# username = str(request.data.get("username"))
username
=
"Wang"
print
(
"file_obj"
,file_obj.name)
# 判断是否存在文件夹
head_path
=
BASE_DIR
+
"\\media\\{}\\head"
.
format
(username).replace(
" "
,"")
print
(
"head_path"
,head_path)
# 如果没有就创建文件路径
if
not
os.path.exists(head_path):
os.makedirs(head_path)
# print("文件名",file_obj.name) # 文件名 name.png
#
# print("文件二进制",file_obj.read()) # 文件二进制 b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x0
#
# print("判断文件> 2.5M",file_obj.multiple_chunks(chunk_size=None)) # 文件大小 False小于2.5M
#
# print("文件大小",file_obj.size) # 文件大小 12651
#
# print("文件编码",file_obj.charset) # None
#
# print("随文件一起上传的内容类型标题",file_obj.content_type) # image/png
#
# print("包含传递给content-type标头的额外参数的字典",file_obj.content_type_extra) # {}
#
# print("text/content-types提供的utf8字符集编码",file_obj.charset) # None
#
#
# 图片后缀
head_suffix
=
file_obj.name.split(
"."
)[
1
]
print
(
"图片后缀"
,head_suffix)
# 图片后缀 png
# 储存路径
file_path
=
head_path
+
"\\{}"
.
format
(
"head."
+
head_suffix)
file_path
=
file_path.replace(
" "
,"")
print
(
"储存路径"
, file_path)
# C:\Users\user\Desktop\DownTest\media\username\head\head.png
# 上传图片
with
open
(file_path,
'wb'
) as f:
for
chunk
in
file_obj.chunks():
f.write(chunk)
message
=
{}
message[
'code'
]
=
200
# 返回图片路径
back_path
=
'\static\{}\head\{}'
.
format
(username,
"head."
+
head_suffix).replace(
" "
,"")
message[
'image'
]
=
back_path
return
JsonResponse(message)
|
补充知识:django后台接口处理element-ui的el-upload组件form data类型数据 。
对于向我这样一只前端和后端的双咸鱼来说写一个不了解的接口实在是太难受了,前端不知道在哪找数据,后端又不知道处理什么样的数据.
现在有这样一个需求,我需要使用element-ui中的el-upload组件完成一个上传文件的功能。但是不知道是不是因为我没有发现,我翻遍了官网都没有找到这个组件点击上传以后发的是什么样的数据请求.
终于我好像突然想起来浏览器的开发者工具可以查看发出的请求 。
于是我们可以写这么一个组件来一探究竟:
点击上传到服务器以后前台就会发出请求,我们就可以使用devtool看具体的请求头等等数据,具体位置在这里:
点击这个upload,找一找,我们就会发现最下面有一个file 。
这应该就是我们要上传的文件。可以看见它是以form data的形式上传的.
所以我们就可以写对应的后端接口了.
这里给一个接口的demo 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
def
writeFile(filePath,
file
):
with
open
(filePath,
"wb"
) as f:
if
file
.multiple_chunks():
for
content
in
file
.chunks():
f.write(content)
else
:
data
=
file
.read()
###.decode('utf-8')
f.write(data)
def
uploadFile(request):
if
request.method
=
=
"POST"
:
fileDict
=
request.FILES.items()
# 获取上传的文件,如果没有文件,则默认为None
if
not
fileDict:
return
JsonResponse({
'msg'
:
'no file upload'
})
for
(k, v)
in
fileDict:
print
(
"dic[%s]=%s"
%
(k,v))
fileData
=
request.FILES.getlist(k)
for
file
in
fileData:
fileName
=
file
._get_name()
filePath
=
os.path.join(settings.TEMP_FILE_PATH, fileName)
print
(
'filepath = [%s]'
%
filePath)
try
:
writeFile(filePath,
file
)
except
:
return
JsonResponse({
'msg'
:
'file write failed'
})
return
JsonResponse({
'msg'
:
'success'
})
|
另外想要在前端获取后端返回的请求的话可以使用on-success、on-error、on-exceed这几个钩子函数,具体可以在element ui的官网找到 。
以上这篇Django后端分离 使用element-ui文件上传方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我.
原文链接:https://www.cnblogs.com/wanghong1994/p/12913091.html 。
最后此篇关于Django后端分离 使用element-ui文件上传方式的文章就讲到这里了,如果你想了解更多关于Django后端分离 使用element-ui文件上传方式的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我一直在阅读有关汇编函数的内容,但对于是使用进入和退出还是仅使用调用/返回指令来快速执行,我感到很困惑。一种方式快而另一种方式更小吗?例如,在不内联函数的情况下,在汇编中执行此操作的最快(stdcal
我正在处理一个元组列表,如下所示: res = [('stori', 'JJ'), ('man', 'NN'), ('unnatur', 'JJ'), ('feel', 'NN'), ('pig',
最近我一直在做很多网络或 IO 绑定(bind)操作,使用线程有助于加快代码速度。我注意到我一直在一遍又一遍地编写这样的代码: threads = [] for machine, user, data
假设我有一个名为 user_stats 的资源,其中包含用户拥有的帖子、评论、喜欢和关注者的数量。是否有一种 RESTful 方式只询问该统计数据的一部分(即,对于 user_stats/3,请告诉我
我有一个简单的 api,它的工作原理是这样的: 用户创建一个请求 ( POST /requests ) 另一个用户检索所有请求 ( GET /requests ) 然后向请求添加报价 ( POST /
考虑以下 CDK Python 中的示例(对于这个问题,不需要 AWS 知识,这应该对基本上任何构建器模式都有效,我只是在这个示例中使用 CDK,因为我使用这个库遇到了这个问题。): from aws
Scala 中管理对象池的首选方法是什么? 我需要单线程创建和删除大规模对象(不需要同步)。在 C++ 中,我使用了静态对象数组。 在 Scala 中处理它的惯用和有效方法是什么? 最佳答案 我会把它
我有一个带有一些内置方法的类。这是该类的抽象示例: class Foo: def __init__(self): self.a = 0 self.b = 0
返回和检查方法执行的 Pythonic 方式 我目前在 python 代码中使用 golang 编码风格,决定移动 pythonic 方式 例子: import sys from typing imp
我正在开发一个 RESTful API。其中一个 URL 允许调用者通过 id 请求特定人员的记录。 返回该 id 不存在的记录的常规值是什么?服务器是否应该发回一个空对象或者一个 404,或者其他什
我正在使用 pathlib.Path() 检查文件是否存在,并使用 rasterio 将其作为图像打开. filename = pathlib.Path("./my_file-name.tif") 但
我正在寻找一种 Pythonic 方式来从列表和字典创建嵌套字典。以下两个语句产生相同的结果: a = [3, 4] b = {'a': 1, 'b': 2} c = dict(zip(b, a))
我有一个正在操裁剪理设备的脚本。设备有时会发生物理故障,当它发生时,我想重置设备并继续执行脚本。我有这个: while True: do_device_control() device
做组合别名的最pythonic和正确的方法是什么? 这是一个假设的场景: class House: def cleanup(self, arg1, arg2, kwarg1=False):
我正在开发一个小型客户端服务器程序来收集订单。我想以“REST(ful)方式”来做到这一点。 我想做的是: 收集所有订单行(产品和数量)并将完整订单发送到服务器 目前我看到有两种选择: 将每个订单行发
我知道在 Groovy 中您可以使用字符串调用类/对象上的方法。例如: Foo."get"(1) /* or */ String meth = "get" Foo."$meth"(1) 有没有办法
在 ECMAScript6 中,您可以使用扩展运算符来解构这样的对象 const {a, ...rest} = obj; 它将 obj 浅拷贝到 rest,不带属性 a。 有没有一种干净的方法可以在
我有几个函数返回数字或None。我希望我的包装函数返回第一个不是 None 的结果。除了下面的方法之外,还有其他方法吗? def func1(): return None def func2(
假设我想设计一个 REST api 来讨论歌曲、专辑和艺术家(实际上我就是这样做的,就像我之前的 1312414 个人一样)。 歌曲资源始终与其所属专辑相关联。相反,专辑资源与其包含的所有歌曲相关联。
这是我认为必须经常出现的问题,但我一直无法找到一个好的解决方案。假设我有一个函数,它可以作为参数传递一个开放资源(如文件或数据库连接对象),或者需要自己创建一个。如果函数需要自己打开文件,最佳实践通常
我是一名优秀的程序员,十分优秀!