iView组件+Django实现前后端分离上传图片

iView组件+Django实现前后端分离上传图片

#1 环境

Vue

"vue": "^2.5.2",
"axios": "^0.19.0",
"vue-axios": "^2.1.4",
"vue-router": "^3.0.1",
"view-design": "^4.0.0"

Django

Django==2.0.7
djangorestframework==3.8.2

这里只展示涉及到上传图片部分的代码

#2 前端

test.vue

<template>
	<div>
		<Upload
			:show-upload-list="false"
			:default-file-list="false"
			:format="['jpg','jpeg','png']"
			:max-size="2048"
			:on-success="uploadSuccess"
			:on-error="uploadError"
			:on-format-error="handleFormatError"
			:on-exceeded-size="handleMaxSize"
			:before-upload="handleBeforeUpload"
			multiple
			type="drag"
			action="http://127.0.0.1:19900/api/test/create-imag/"
			style="display: inline-block;width:58px;"
		>
			<div style="width: 58px;height:58px;line-height: 58px;">
				<Icon type="ios-camera" size="20"></Icon>
			</div>
		</Upload>
	</div>
</template>
<script>
    export default {
        data () {
            return {}
        },
        methods: {
            uploadSuccess (response, file, fileList) { // 文件上传成功时的钩子,返回字段为 response, file, fileList
                this.$Message.success("上传成功");
            },
            uploadError(error, file, fileList){ // 文件上传失败时的钩子,返回字段为 error, file, fileList
                this.$Message.error("上传失败");

            },
            handleFormatError(file, fileList){ // 文件格式验证失败时的钩子,返回字段为 file, fileList

            },
            handleMaxSize(file, fileList){ // 文件超出指定大小限制时的钩子,返回字段为 file, fileList

            },
            handleBeforeUpload(response){ // 上传文件之前的钩子,参数为上传的文件,若返回 false 或者 Promise 则停止上传

            }
        },
    }
</script>
<style>
	.demo-upload-list{
		display: inline-block;
		width: 60px;
		height: 60px;
		text-align: center;
		line-height: 60px;
		border: 1px solid transparent;
		border-radius: 4px;
		overflow: hidden;
		background: #fff;
		position: relative;
		box-shadow: 0 1px 1px rgba(0,0,0,.2);
		margin-right: 4px;
	}
	.demo-upload-list img{
		width: 100%;
		height: 100%;
	}
	.demo-upload-list-cover{
		display: none;
		position: absolute;
		top: 0;
		bottom: 0;
		left: 0;
		right: 0;
		background: rgba(0,0,0,.6);
	}
	.demo-upload-list:hover .demo-upload-list-cover{
		display: block;
	}
	.demo-upload-list-cover i{
		color: #fff;
		font-size: 20px;
		cursor: pointer;
		margin: 0 2px;
	}
</style>
prop注释
show-upload-list是否显示已上传文件列表
default-file-list设置默认已上传的列表
format支持的文件类型,与 accept 不同的是,format 是识别文件的后缀名,accept 为 input 标签原生的 accept 属性,会在选择文件时过滤,可以两者结合使用
max-size文件大小限制,单位 kb
on-success文件上传成功时的钩子,返回字段为 response, file, fileList
on-error文件上传失败时的钩子,返回字段为 error, file, fileList
on-format-error文件格式验证失败时的钩子,返回字段为 file, fileList
on-exceeded-size文件超出指定大小限制时的钩子,返回字段为 file, fileList
before-upload上传文件之前的钩子,参数为上传的文件,若返回 false 或者 Promise 则停止上传
multiple可以选择多个文件
type可以拖拽上传
action前后端分离的后端接口(完整的接口url,如果只填路由,默认ip:port是前端的地址)

前端效果:

20191110131252-image.png


#3 后端

models.py

class TestModel(models.Model):

    image = models.ImageField(upload_to="blog_code/static/images/blog",default="") # upload_to : 图片保存路径 

#3.1 原生的Django

def post(self,request):

    models.TestModel.objects.create(
        image = request.data["file"]
    )

    return Response({
        "success": False,
        "msg": "新增图片",
        "results": ""
    }, status=status.HTTP_200_OK)

原生的django, 获取文件在request.data[“file”]里面,获取一个文件对象

#3.1 Django Rest Framework

视图

from utils.common.mixins.mixin import MyCreateModeMixin
from app_test.views.api.create_imag.create_test_serializer import CreateImagSerializer
from rest_framework import status
from rest_framework.response import Response
from app_test import models

class CreateImagViewSet(MyCreateModeMixin):
    """新增图片"""
    authentication_classes = () # 验证
    permission_classes = () # 权限
    msg_create = "新增图片" # 提示信息
    results_display = False  # 是否显示序列化信息, 默认显示
    serializer_class = CreateImagSerializer # 序列化类

序列化

from app_test import models
from utils.common.serializers.serializer import MySerializerBase




class CreateImagSerializer(MySerializerBase):
    """新增测试-序列化"""

    class Meta:
        model = models.TestModel
        fields = ["image",]

    def create(self, validated_data):
        obj = models.TestModel.objects.create(
            image = self.context["request"].data.get("file",None)
        )

        return obj

DRF中文件存在self.context[“request”].data.get(“file”,None)里面

这样就能简单的实现前后端分离上传图片功能

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值