django中实现图片上传

在django开发中,图片上传是我们经常需要做的,比如用户头像的上传,文章封面的上传;

下面我们来看一下具体的实现方式:

Ajax 上传图片

Ajax上传的好处在与我们上传后可以根据服务器返回的路径将上传成功的图片立即显示在页面上让用户可以看到;

具体上传方式如下:

html

# 1.添加隐藏域input,并将input的type设置为‘file’类型,设置onchange事件并将获取到的图片传到事件中
<input type="file" id="file" onchange="up_img(this.files[0])" style="display: none">
<section class="fixed">
    # 2.设置头像展示组件,并设置点击事件,当点击时调用第一步中的input点击事件
    <span><img src="/{{ user.icon }}" onclick="file.click()"></span>
    <p><a href="#">{{ user.name }}</a></p>
    <p><span class="glyphicon glyphicon-fire"></span><span>等级</span></p>
    <p><span class="glyphicon glyphicon-heart"></span>商品收藏</p>
</section>

# 3. 在input点击事件中使用Ajax将图片上传到服务器
<script>
// 上传头像
function up_img(file){
  let xhr = new XMLHttpRequest();  # 创建XMLHttpRequest对象
  xhr.open('post', '/main/upfile', true);  # post异步上传到/main/upfile路径
  xhr.onload = function () {
      # 上传成功后,在此处接收服务器返回的数据并进行处理
      let data = xhr.responseText;
      data = JSON.parse(data);
      console.log(data);
      $('.fixed img').attr('src', data['img'])  # 将返回的服务器图片地址添加到img中显示给用户
  };
  let formdata = new FormData();  # 使用formdata存储图片文件
  formdata.append('file', file);
  xhr.send(formdata);  # 发送请求
}
</script>

views.py

@csrf_exempt  # 去除csrf验证
def upfile(request):
    sava_path = '/static/main/img/cart.png'  # 默认图片
    if request.method == 'POST':
        files = request.FILES.get('file')  # 获取图片
        # 图片存放路径
        filename = encryption(str(time.time())) + '.' + files.content_type.split('/')[1]
        sava_path = 'static/main/user_file/' + filename

        # 将图片分段读取并写入文件
        with open(sava_path, 'wb') as f:
            for file in files.chunks():
                f.write(file)
                f.flush()
        # 将图片路径更新到当前用户的表中
        user = User.objects.filter(token=request.COOKIES.get('token'))
        user.update(icon=sava_path)
    # 将上传成功的图片路径返回给页面
    return JsonResponse({'img': sava_path})

效果展示:

多布局.gif
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 兰亭临帖 提笔欲书情真切 落日余晖 谁惹骤雨芭蕉叶 衣袖轻卷 写下不悔如初的思念 又在提捺间 不借胭脂的容颜 瓦上...
    从此凋朱颜阅读 495评论 0 2
  • 谁在呼唤我 彷徨的仲夏 落日点燃了晚霞 思念烧成画 星光依偎着灯塔 萤火虫不回家 风载着火花 撕开了尘沙 如果还会...
    53aad588f285阅读 413评论 0 4
  • 《经济学的思维方式》,用了6天时间仔细读了一遍,类似于教科书,但远胜于教科书。将供给需求、机会成本、边际效应、比较...
    FrankCoach阅读 475评论 0 0
  • Using English at Work [TOC] ==Ⅰ. Words== critiquepervasiv...
    迁喵阅读 359评论 0 0
  • 在5.x正常工作,在2017.2.2上会出现报错如下: InvalidOperationException: Ca...
    北风瘦马阅读 2,276评论 3 0