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 相关文章推荐
一段利用WSH修改和查看IP配置的代码
May 11 Javascript
JavaScript 工具库 Cloudgamer JavaScript Library v0.1 发布
Oct 29 Javascript
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
Jan 08 Javascript
jQuery.position()方法获取不到值的安全替换方法
Mar 13 Javascript
javascript入门教程基础篇
Nov 16 Javascript
利用jsonp跨域调用百度js实现搜索框智能提示
Aug 24 Javascript
js 打开新页面在屏幕中间的实现方法
Nov 02 Javascript
Three.js利用Detector.js插件如何实现兼容性检测详解
Sep 26 Javascript
angular6.0使用教程之父组件通过url传递id给子组件的方法
Jun 30 Javascript
JS事件绑定的常用方式实例总结
Mar 02 Javascript
基于原生js实现判断元素是否有指定class名
Jul 11 Javascript
React Hook用法示例详解(6个常见hook)
Apr 28 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
PHP4中session登录页面的应用
2008/07/25 PHP
献给php初学者(入门学习经验谈)
2010/10/12 PHP
PHP简单数据库操作类实例【支持增删改查及链式操作】
2016/10/10 PHP
在laravel中使用with实现动态添加where条件
2019/10/10 PHP
分享别人写的一个小型js框架
2007/08/13 Javascript
jQuery学习笔记 操作jQuery对象 属性处理
2012/09/19 Javascript
node.js中的console.assert方法使用说明
2014/12/10 Javascript
jQuery性能优化技巧分析
2015/02/20 Javascript
JQuery的ON()方法支持的所有事件罗列
2015/02/28 Javascript
javascript实现table表格隔行变色的方法
2015/05/13 Javascript
JS拖拽组件学习使用
2016/01/19 Javascript
AngularJS ng-app 指令实例详解
2016/07/30 Javascript
JSONP和批量操作功能的实现方法
2016/08/21 Javascript
js前端解决跨域问题的8种方案(最新最全)
2016/11/18 Javascript
JS出现失效的情况总结
2017/01/20 Javascript
原生js实现轮播图的示例代码
2017/02/20 Javascript
在vue中使用Autoprefixed的方法
2018/07/27 Javascript
vue中设置height:100%无效的问题及解决方法
2018/07/27 Javascript
ES6中的迭代器、Generator函数及Generator函数的异步操作方法
2019/05/12 Javascript
[01:00:52]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第一场
2018/04/05 DOTA
Python内建模块struct实例详解
2018/02/02 Python
详解Python下Flask-ApScheduler快速指南
2018/11/04 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
2020/03/18 Python
Jupyter打开图形界面并画出正弦函数图像实例
2020/04/24 Python
Django QuerySet查询集原理及代码实例
2020/06/13 Python
python实现图片素描效果
2020/09/26 Python
改变生活的男士内衣:SAXX Underwear
2019/08/28 全球购物
网络公司美工设计工作个人的自我评价
2013/11/03 职场文书
优秀毕业生求职推荐信范文
2013/11/21 职场文书
高中自我评价分享
2013/12/05 职场文书
党的群众路线教育实践活动总结报告
2014/07/03 职场文书
课外活动总结范文
2014/07/09 职场文书
开会通知短信大全
2015/04/20 职场文书
正规欠条模板
2015/07/03 职场文书
MySQL为id选择合适的数据类型
2021/06/07 MySQL
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
2021/06/29 Python