JS实现上传图片的三种方法并实现预览图片功能


Posted in Javascript onJuly 14, 2017

在常见的用户注册页面,需要用户在本地选择一张图片作为头像,并同时预览。

常见的思路有两种:一是将图片上传至服务器的临时文件夹中,并返回该图片的url,然后渲染在html页面;另一种思路是,直接在本地内存中预览图片,用户确认提交后再上传至服务器保存。

这两种方法各有利弊,方法一很明显,浪费流量和服务器资源;方法二则加重了浏览器的负担,并且对浏览器的兼容性要求更高(在某些低版本中的IE浏览器不支持)。

以下是实现上述思路的方法:

1. 模板文件

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <div style="margin-left: 30px; margin-top: 30px">
    <form action="">
      {% csrf_token %}
    <h3>用户注册</h3>
    <p>用户名:<input type="text" name="userName"></p>
    <p>密码:<input type="password" name="password"></p>
    <p>邮箱:<input type="text" name="email"></p>
      <input id="avatar" type="text" value="/static/images/sample.png" name="avatar" style="width: 400px"> {# 实际应用中要将该input标签隐藏,display:none; #}
      <p><input type="submit" value="注册"></p>
      </form>
    <div style="position: absolute; top: 85px; left: 300px;">
    <input id="avatarSlect" type="file" style="position: absolute;float: left; z-index: 10; opacity: 0;width: 100px; height: 100px;">
    <img id="avatarPreview" src="/static/images/sample.png" title="点击更换图片" style="position: absolute; z-index: 9; float: left; width: 100px; height: 100px">
      </div>
  </div>
</body>
<script src="/static/jquery-3.2.1.js"></script>
<script>
  $(function () {
      bindAvatar();
 });
  function bindAvatar() {
      if(window.URL.createObjectURL){
        bindAvatar3();
      }else if(window.FileReader){
        bindAvatar2();
      }else {
        bindAvatar1();
      }
 }
  /*Ajax上传至后台并返回图片的url*/
  function bindAvatar1() {
    $("#avatarSlect").change(function () {
    var csrf = $("input[name='csrfmiddlewaretoken']").val();
    var formData=new FormData();
    formData.append("csrfmiddlewaretoken",csrf);
    formData.append('avatar', $("#avatarSlect")[0].files[0]);  /*获取上传的图片对象*/
    $.ajax({
      url: '/upload_avatar/',
          type: 'POST',
          data: formData,
          contentType: false,
          processData: false,
          success: function (args) {
        console.log(args);  /*服务器端的图片地址*/
              $("#avatarPreview").attr('src','/'+args);  /*预览图片*/
              $("#avatar").val('/'+args);  /*将服务端的图片url赋值给form表单的隐藏input标签*/
     }
      })
 })
  }
  /*window.FileReader本地预览*/
  function bindAvatar2() {
    console.log(2);
       $("#avatarSlect").change(function () {
           var obj=$("#avatarSlect")[0].files[0];
           var fr=new FileReader();
           fr.onload=function () {
               $("#avatarPreview").attr('src',this.result);
               console.log(this.result);
               $("#avatar").val(this.result);
      };
      fr.readAsDataURL(obj);
    })
 }
 /*window.URL.createObjectURL本地预览*/
 function bindAvatar3() {
   console.log(3);
      $("#avatarSlect").change(function () {
          var obj=$("#avatarSlect")[0].files[0];
          var wuc=window.URL.createObjectURL(obj);
           $("#avatarPreview").attr('src',wuc);
           $("#avatar").val(wuc);
{#           $("#avatarPreview").load(function () {#}    /*当图片加载后释放内存空间,但在jQuery3.2.1中会报错。浏览器关闭后也会自动释放*/
{#               window.URL.revokeObjectURL(wuc);#}
{#      })#}
   })
 }
</script>
</html>

2. 视图函数

from django.shortcuts import render, HttpResponse
def test(request):
  return render(request, 'test.html')
def upload_avatar(request):
  file_obj = request.FILES.get('avatar')
  file_path = os.path.join('static/images', file_obj.name)
  with open(file_path, 'wb') as f:
    for chunk in file_obj.chunks():
      f.write(chunk)
  return HttpResponse(file_path)

3. 路由系统

from django.conf.urls import url
from django.contrib import admin
from home import views as homeViews
urlpatterns = [
  url(r'^admin/', admin.site.urls),
  url(r'^upload_avatar/', homeViews.upload_avatar), # 上传头像
  url(r'^test/', homeViews.test), # 测试页面
]

验证效果:

选择图片前:

JS实现上传图片的三种方法并实现预览图片功能

Ajax上传图片至服务器,并返回浏览器该图片的url:

JS实现上传图片的三种方法并实现预览图片功能

window.FileReader本地预览,form表单提交:

JS实现上传图片的三种方法并实现预览图片功能

 window.URL.createObjectURL本地预览,form表单提交:

JS实现上传图片的三种方法并实现预览图片功能

以上所述是小编给大家介绍的JS实现上传图片的三种方法并实现预览图片功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript 在网页中的运用(asp.net)
Nov 23 Javascript
JS 添加千分位与去掉千分位的示例
Jul 11 Javascript
JS批量操作CSS属性详细解析
Dec 16 Javascript
详解JavaScript中shift()方法的使用
Jun 09 Javascript
jquery实现可关闭的倒计时广告特效代码
Sep 02 Javascript
Angularjs 制作购物车功能实例代码
Sep 14 Javascript
自制简易打赏功能的实例
Sep 02 Javascript
vue左侧菜单,树形图递归实现代码
Aug 24 Javascript
vue遍历生成的输入框 绑定及修改值示例
Oct 30 Javascript
vue中对象数组去重的实现
Feb 06 Javascript
解决antd Form 表单校验方法无响应的问题
Oct 27 Javascript
JS创建或填充任意长度数组的小技巧汇总
Oct 24 Javascript
JS实现数组去重方法总结(六种方法)
Jul 14 #Javascript
Javascript中Promise的四种常用方法总结
Jul 14 #Javascript
js学习心得_一个简单的动画库封装tween.js
Jul 14 #Javascript
详解VUE中v-bind的基本用法
Jul 13 #Javascript
vue通过watch对input做字数限定的方法
Jul 13 #Javascript
深入理解vue $refs的基本用法
Jul 13 #Javascript
js自定义弹框插件的封装
Aug 24 #Javascript
You might like
PHP模拟SQL Server的两个日期处理函数
2006/10/09 PHP
PHP 实现多服务器共享 SESSION 数据
2009/08/15 PHP
windows 2008r2+php5.6.28环境搭建详细过程
2019/06/18 PHP
js 巧妙去除数组中的重复项
2010/01/25 Javascript
JavaScript之appendChild、insertBefore和insertAfter使用说明
2010/12/30 Javascript
推荐40个非常优秀的jQuery插件和教程【系列三】
2011/11/09 Javascript
angularjs指令中的compile与link函数详解
2014/12/06 Javascript
javascript判断变量是否有值的方法
2015/04/20 Javascript
jquery获取文档高度和窗口高度汇总
2016/01/25 Javascript
JavaScript+html5 canvas绘制渐变区域完整实例
2016/01/26 Javascript
关于Bootstrap弹出框无法调用问题的解决办法
2016/03/10 Javascript
浅谈jQuery 选择器和dom操作
2016/06/07 Javascript
微信小程序 数据绑定详解及实例
2016/10/25 Javascript
AngularJS实现网站换肤实例
2021/02/19 Javascript
WebStorm ES6 语法支持设置&amp;babel使用及自动编译(详解)
2017/09/08 Javascript
JS 中使用Promise 实现红绿灯实例代码(demo)
2017/10/20 Javascript
React实现全局组件的Toast轻提示效果
2018/09/21 Javascript
微信小程序实现页面分享onShareAppMessage
2019/08/12 Javascript
jquery.tagsinput.js实现记录checkbox勾选的顺序
2019/09/21 jQuery
JavaScript函数IIFE使用详解
2019/10/21 Javascript
[01:15:36]加油刀塔第二期网络版
2014/08/09 DOTA
pandas中Timestamp类用法详解
2017/12/11 Python
python对列进行平移变换的方法(shift)
2019/01/10 Python
python实现转盘效果 python实现轮盘抽奖游戏
2019/01/22 Python
Pytorch中的VGG实现修改最后一层FC
2020/01/15 Python
微信小程序之html5 canvas绘图并保存到系统相册
2019/06/20 HTML / CSS
Ted Baker美国官网:英国时尚品牌
2018/10/29 全球购物
初一新生军训方案
2014/05/22 职场文书
大学生党员自我剖析材料
2014/10/06 职场文书
大学生毕业评语
2014/12/31 职场文书
先进个人总结范文
2015/02/15 职场文书
校本培训个人总结
2015/02/28 职场文书
雨雪天气温馨提示
2015/07/15 职场文书
Mysql Show Profile
2021/04/05 MySQL
MySQL 亿级数据导入导出及迁移笔记
2021/06/18 MySQL
MySQL修改默认引擎和字符集详情
2021/09/25 MySQL