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 拖放效果实现代码
Jan 22 Javascript
JavaScript 原型链学习总结
Oct 29 Javascript
JS Range HTML文档/文字内容选中、库及应用介绍
May 12 Javascript
全面解析Bootstrap表单使用方法(表单样式)
Nov 24 Javascript
require简单实现单页应用程序(SPA)
Jul 12 Javascript
Node.js Sequelize如何实现数据库的读写分离
Oct 23 Javascript
Vue.js一个文件对应一个组件实践
Oct 27 Javascript
基于JavaScript实现本地图片预览
Feb 08 Javascript
js实现股票实时刷新数据案例
May 14 Javascript
原生JS实现不断变化的标签
May 22 Javascript
validationEngine 表单验证插件使用实例代码
Jun 15 Javascript
解决ele ui 表格表头太长问题的实现
Nov 13 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加MYSQL服务器
2006/10/09 PHP
php学习笔记之面向对象编程
2012/12/29 PHP
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
2015/09/22 PHP
详解php中的implements 使用
2017/06/13 PHP
PHP实现数据四舍五入的方法小结【4种方法】
2019/03/27 PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
2020/08/30 PHP
用jQuery获取IE9下拉框默认值问题探讨
2013/07/22 Javascript
JavaScript检测实例属性, 原型属性
2015/02/04 Javascript
超级简单实现JavaScript MVC 样式框架
2015/03/24 Javascript
Jquery promise实现一张一张加载图片
2015/11/13 Javascript
jquery实现列表上下移动功能
2016/02/25 Javascript
JS实现获取来自百度,Google,soso,sogou关键词的方法
2016/12/21 Javascript
vue父子组件的数据传递示例
2017/03/07 Javascript
微信小程序教程系列之新建页面(4)
2017/04/17 Javascript
详解如何在NodeJS项目中优雅的使用ES6
2017/04/22 NodeJs
vue超时计算的组件实例代码
2018/07/09 Javascript
详解mpvue中小程序自定义导航组件开发指南
2019/02/11 Javascript
详解JavaScript的内存空间、赋值和深浅拷贝
2019/04/17 Javascript
JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】
2020/02/24 Javascript
[05:15]DOTA2英雄梦之声_第16期_灰烬之灵
2014/06/21 DOTA
urllib2自定义opener详解
2014/02/07 Python
详细解析Python当中的数据类型和变量
2015/04/25 Python
用Python实现命令行闹钟脚本实例
2016/09/05 Python
Python中import机制详解
2017/11/14 Python
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
python调用staf自动化框架的方法
2018/12/26 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
2019/01/29 Python
Python实现邮件发送的详细设置方法(遇到问题)
2021/01/18 Python
HTML 5 input placeholder 属性如何完美兼任ie
2014/05/12 HTML / CSS
一名女生的自荐信
2013/12/08 职场文书
毕业生写求职信的要点
2014/03/04 职场文书
通知的写法
2015/04/23 职场文书
MySQL下使用Inplace和Online方式创建索引的教程
2021/05/26 MySQL
Mysql分库分表之后主键处理的几种方法
2022/02/15 MySQL
Python安装使用Scrapy框架
2022/04/12 Python
mysql函数之截取字符串的实现
2022/08/14 MySQL