Django上传图片,完整前后端

先说说这个功能吧,这个功能是前端解决了两个月没有都没有解决的问题。我也是实在搞不懂为啥还有脸不离职。

我们先来看前端代码

前端这里我只贴出此种写法,有很多东西还需要你自己完善,申明一下你需要引入jquery和layer的JS文件。

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <form method="post" enctype="multipart/form-data" id="fromId">
        {% csrf_token %}
        <div style="width: 100%;height: 50px;font-size: 1.3em;line-height: 50px;">
            <input type="file" id="user_portrait" name="image" style="margin-left: 10px;">
            <button type="button" οnclick="notimages()">点击上传</button>
        </div>
        <div style="width: 100%;height: 30px;text-align: center;line-height: 30px;font-size: 1.3em;">
                        图片预览
         </div>
         <div style="width: 300px;height: 300px;margin: auto;margin-top: 10px;">
             <img src="" id="preview" alt="" style="width: 100%;height: 100%;">
         </div>
    </form>
</body>
</html>
<script>
    //图片预览
    $(function () {
        $('#user_portrait').change(function (e) {
            var file = e.target.files[0]||e.dataTransfer.files[0];
            if (file){
                var reader = new FileReader();
                reader.onload = function () {
                    $('#preview').attr('src',this.result)
                };
                reader.readAsDataURL(file);
            }
        })
    });
    //图片上传
    function notimages() {
        var formDate = new FormData();
        var token = $('input[name=csrfmiddlewaretoken]').val();
        var img_file = document.getElementById('user_portrait');
        var fileobj = img_file.files[0];
        formDate.append('images',fileobj);
        formDate.append('csrfmiddlewaretoken',token);
        $.ajax({
            url : '写上你要上传的路由',
            data : formDate,
            type : 'POST',
            async : false,
            dataType : 'json',
            processData : false,
            contentType : false,
            success : function (data) {
                if (data.status === 'success') {
                    layer.msg(data['message'])
                } else if (data.status === 'fail') {
                    layer.msg(data['message']);
                } 
            }
        })
    }
</script>

下面这是Django的后端代码

from django.shortcuts import HttpResponse
from app.models import Member
import json
import os
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth.decorators import login_required

# 头像上传
@login_required
@csrf_exempt
def uploading(request):
    if request.method == 'POST':
        try:
            # 拿到图片的对象
            photo = request.FILES['images']
            # 判断图片是否小于2M
            if photo.size / 1024 / 1024 < 2:
                # 判断图片的格式
                if photo.content_type == 'image/jpeg' or photo.content_type == 'image/jpg' or photo.content_type == 'image/png':
                    # 获取当前格式化时间用于拼接图片名称
                    nowTime = str(get_timesecond())
                    # 创建一个文件
                    path = os.path.join(settings.MEDIA_UPDATA, nowTime + photo.name)
                    # 写文件 遍历图片文件流
                    with open(path, 'wb') as f:
                        for content in photo.chunks():
                            f.write(content)
                    # 关闭文件流
                    f.close()
                    # 拼接文件名和路径
                    userima_name = '/static/img/{}'.format(nowTime + photo.name)
                    # 在数据库中保存上传记录
                    userid = request.session['member_id']
                    img = Member.objects.filter(member_id=userid).first()
                    user_portrait_path = img.member_portrait
					# 删除用户之前的头像
                    if os.path.exists(user_portrait_path):
                        os.remove(user_portrait_path)
                    user_new_portrait = Member.objects.filter(user_id=userid).update(member_portrait=userima_name)
                    if user_new_portrait:
                        # 返回图片路径
                        result = {'status': 'success', 'message': '上传成功!', 'img': userima_name}
                        return HttpResponse(json.dumps(result))
                    else:
                        result = {'status': 'fail', 'message': '上传失败!'}
                        return HttpResponse(json.dumps(result))
                else:
                    result = {'status': 'fail', 'message': '只能上传jpeg、jpg、png格式的图片!'}
                    return HttpResponse(json.dumps(result))
            else:
                result = {'status': 'fail', 'message': '上传的文件超过了2M!'}
                return HttpResponse(json.dumps(result))
        except:
            result = {'status': 'failss'}
            return HttpResponse(json.dumps(result))

以上就是今天分享的全部内容了,有看不懂的小伙伴们可以给我留言,我会尽量抽出点时间帮助你们。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本门课程重实战,将基础知识拆解到项目里,让你在项目情境里学知识。 这样的学习方式能让你保持兴趣、充满动力,时刻知道学的东西能用在哪、能怎么用。 平时不明白的知识点,放在项目里去理解就恍然大悟了。   一、融汇贯通 本视频采用了前后端分离的开发模式,前端使用Vue.js+Element UI实现了Web页面的呈现,后端使用Python 的Django框架实现了数据访问的接口,前端通过Axios访问后端接口获得数据。在学习完本章节后,真正理解前后端的各自承担的工作。   二、贴近实战 本系列课程为练手项目实战:学生管理系统v4.0的开发,项目包含了如下几个内容:项目的总体介绍、基本功能的演示、Vuejs的初始化、Element UI的使用、在Django中实现针对数据的增删改查的接口、在Vuejs中实现前端增删改查的调用、实现文件的上传、实现表格的分页、实现导出数据到Excel、实现通过Excel导入数据、实现针对表格的批量化操作等等,所有的功能都通过演示完成、贴近了实战   三、课程亮点 在本案例中,最大的亮点在于前后端做了分离,真正理解前后端的各自承担的工作。前端如何和后端交互   适合人群: 1、有Python语言基础、web前端基础,想要深入学习Python Web框架的朋友; 2、有Django基础,但是想学习企业级项目实战的朋友; 3、有MySQL数据库基础的朋友  
Django 中实现前后端分离的图片上传,可以通过以下步骤来完成: 1. 在前端页面中添加一个文件上传的表单,例如: ```html <form enctype="multipart/form-data" method="POST"> {% csrf_token %} <input type="file" name="image"> <button type="submit">上传</button> </form> ``` 2. 在 Django 后端中编写一个视图函数来处理图片上传请求,例如: ```python from django.http import JsonResponse def upload_image(request): if request.method == 'POST' and request.FILES['image']: image = request.FILES['image'] # 处理上传的图片,例如保存到本地或上传到云存储 # ... # 返回上传结果 return JsonResponse({'status': 'success', 'url': 'http://example.com/path/to/image'}) else: return JsonResponse({'status': 'error', 'message': '上传失败'}) ``` 3. 在前端页面中使用 AJAX 技术将图片上传请求发送到后端,并在上传成功后显示上传结果,例如: ```javascript $('form').submit(function(event) { event.preventDefault(); var formData = new FormData(this); $.ajax({ url: '/upload_image/', type: 'POST', data: formData, processData: false, contentType: false, success: function(response) { if (response.status == 'success') { // 显示上传成功的图片 $('#image').attr('src', response.url); } else { alert('上传失败:' + response.message); } }, error: function(xhr, status, error) { alert('上传失败:' + error); } }); }); ``` 其中,`/upload_image/` 是后端处理图片上传请求的 URL,`FormData` 对象可以将表单数据序列化为一个 `multipart/form-data` 格式的字符串,`processData: false` 和 `contentType: false` 参数可以避免 jQuery 对表单数据进行默认的处理,从而实现上传文件的功能。上传成功后,可以通过 `response.url` 获取上传的图片的 URL,并显示在页面上。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值