JS+php后台实现文件上传功能详解


Posted in Javascript onMarch 02, 2019

本文实例讲述了JS+php后台实现文件上传功能。分享给大家供大家参考,具体如下:

一、利用 FormData 对象形式上传

FormData 是 XMLHttpRequest 2 的产物,兼容 IE10+。

FormData 对象,可以把form中所有表单元素的name与value组成一个queryString,提交到后台。在使用Ajax提交时,使用FormData对象可以减少拼接queryString的工作量。

使用 FormData 对象

1.取得form对象,作为参数传入到FormData对象

html:

<form name="form1" id="form1">
   <input type="text" name="name" value="fdipzone">
   <input type="text" name="gender" value="male">
</form>

js:

var form = document.getElementById('form1');
var formdata = new FormData(form);

2.创建一个FormData空对象,然后使用append方法添加key/value

var formdata = new FormData();
formdata.append('name','fdipzone');
formdata.append('gender','male');

使用FormData提交表单及上传文件实例:

实例1

一般项目中使用的点击上传文件的按钮跟 <input type="file"/> 默认样式是不一样的,我们得自定义。方法是,自己写一个<button> 按钮,然后再写一个 <input type="file"/>(这个要隐藏,太难看),点击 <button> 的时候出发 <input type="file"/> 的 click 事件。

HTML:

<input type="file"
    :style="{display: 'none'}"
    ref="input" @change="selectedFile"
/>
<button @click="upload">上传</button>

JS:

methods: {
  triggerSelect () {
   this.$refs.input.click()
  },
  selectedFile (e) {
   console.log(e.target.files[0])
   //根据项目需求做具体处理,比如说获取文件名
  },
  async upload () {
   //如果不需要用到上传后的返回值可以把 async...await 语法去掉
   let files = this.$refs.input.files;
   if(files.length > 0) {
    let form = new FormData();
    form.append('file', files[0])
    let data = await new Promise((resolve, reject) => {
      axios({
       url: '',
       method: 'post',
       data: form
      })
       .then(res => {
        resolve(res)
       })
       .catch(err => {
        reject(err)
       })
     })
   }
  }
}

实例2

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
 <head>
 <meta http-equiv="content-type" content="text/html; charset=utf-8">
 <title> FormData Demo </title>
 </head>
 <body>
  <form name="form1" id="form1">
    <p>name:<input type="text" name="name" ></p>
    <p>gender:<input type="radio" name="gender" value="1">male <input type="radio" name="gender" value="2">female</p>
    <p>photo:<input type="file" name="photo" id="photo"></p>
    <p><input type="button" name="b1" value="submit" onclick="fsubmit()"></p>
  </form>
  <div id="result"></div>
 <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
 <script type="text/javascript">
  function fsubmit(){
    var data = new FormData($('#form1')[0]);
    $.ajax({
      url: 'server.php',
      type: 'POST',
      data: data,
      dataType: 'JSON',
      cache: false,
      processData: false, //不处理发送的数据,因为data值是FormData对象,不需要对数据做处理
      contentType: false  //不设置Content-type请求头
    }).done(function(ret){
      if(ret['isSuccess']){
        var result = '';
        result += 'name=' + ret['name'] + '<br>';
        result += 'gender=' + ret['gender'] + '<br>';
        result += '<img src="' + ret['photo'] + '" width="100">';
        $('#result').html(result);
      }else{
        alert('提交失??);
      }
    });
    return false;
  }
 </script>
</body>
</html>

server.php

<?php
$name = isset($_POST['name'])? $_POST['name'] : '';
$gender = isset($_POST['gender'])? $_POST['gender'] : '';
$filename = time().substr($_FILES['photo']['name'], strrpos($_FILES['photo']['name'],'.'));
$response = array();
if(move_uploaded_file($_FILES['photo']['tmp_name'], $filename)){
  $response['isSuccess'] = true;
  $response['name'] = $name;
  $response['gender'] = $gender;
  $response['photo'] = $filename;
}else{
  $response['isSuccess'] = false;
}
echo json_encode($response);
?>

带显示图片的上传图片

// -------- 将以base64的图片url数据转换为Blob --------
function convertBase64UrlToBlob(urlData, filetype){
    //去掉url的头,并转换为byte
    var bytes = window.atob(urlData.split(',')[1]);
    //处理异常,将ascii码小于0的转换为大于0
    var ab = new ArrayBuffer(bytes.length);
    var ia = new Uint8Array(ab);
    var i;
    for (i = 0; i < bytes.length; i++) {
      ia[i] = bytes.charCodeAt(i);
    }
    return new Blob([ab], {type : filetype});
}
$input.on('change', function (e) {
    var input = $input.get(0);
    var files = input.files || [];
    if (files.length === 0) {
      return;
    }
    console.log('选中 ' + files.length + ' 个文件');
    // 遍历选中的文件,预览、上传
    $.each(files, function (key, file) {
      var filename = file.name || '';
      var fileType = file.type || '';
      var reader = new FileReader();
      // onload事件
      reader.onload = function (e) {
        var base64 = e.target.result || this.result;
        var formData = new FormData();
        formData.append("upload_file", convertBase64UrlToBlob(base64, fileType), filename);
        var xhr = new XMLHttpRequest();
        // 开始上传
        xhr.open('POST', uploadImgUrl, true);
        // 发送数据
        xhr.send(formData);
      });
      reader.readAsDataURL(file);
    });
});

二、base64 字符串方式上传图片

base64 在线转换网站:http://tools.3water.com/transcoding/img2base64

DataURI 允许在HTML文档中嵌入小文件,可以使用 img 标签或 CSS 嵌入转换后的 Base64 编码,减少 HTTP 请求,加快小图像的加载时间。 经过Base64 编码后的文件体积一般比源文件大 30% 左右。

Base64 在CSS中的使用:

.box{
 background-image: url("data:image/jpg;base64,/9j/4QMZR...");
}

Base64 在HTML中的使用:

<img src="data:image/jpg;base64,/9j/4QMZR..." />

不推荐用base64,效率慢,消耗流量,占用空间。推荐使用把base64图片格式转换成FormData形式传递

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
js 字符串转化成数字的代码
Jun 29 Javascript
JavaScript严格模式禁用With语句的原因
Oct 20 Javascript
jQuery中slideUp()方法用法分析
Dec 24 Javascript
用队列模拟jquery的动画算法实例
Jan 20 Javascript
JS实现的左侧竖向滑动菜单效果代码
Oct 19 Javascript
Javascript 创建类并动态添加属性及方法的简单实现
Oct 20 Javascript
vue.js中引入vuex储存接口数据及调用的详细流程
Dec 14 Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
Nov 05 Javascript
原生js实现文件上传、下载、封装等实例方法
Jan 05 Javascript
通过js实现压缩图片上传功能
Feb 25 Javascript
解决nuxt页面中mounted、created、watch执行两遍的问题
Nov 05 Javascript
使用Vue.js和MJML创建响应式电子邮件
Mar 23 Vue.js
JS事件绑定的常用方式实例总结
Mar 02 #Javascript
JS实现获取数组中最大值或最小值功能示例
Mar 02 #Javascript
JS使用队列对数组排列,基数排序算法示例
Mar 02 #Javascript
VUE引入第三方js包及调用方法讲解
Mar 01 #Javascript
JavaScript数据结构与算法之二叉树添加/删除节点操作示例
Mar 01 #Javascript
JavaScript数据结构与算法之二叉树实现查找最小值、最大值、给定值算法示例
Mar 01 #Javascript
Angular7.2.7路由使用初体验
Mar 01 #Javascript
You might like
PHP单元测试配置与使用方法详解
2019/12/27 PHP
javawscript 三级菜单的实现原理
2009/07/01 Javascript
JavaScript代码复用模式实例分析
2012/12/02 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
js实现双击图片放大单击缩小的方法
2015/02/17 Javascript
jquery实现点击变换导航样式的方法
2015/08/31 Javascript
js实现创建删除html元素小结
2015/09/30 Javascript
JavaScript开发Chrome浏览器扩展程序UI的教程
2016/05/16 Javascript
jquery获取img的src值的简单实例
2016/05/17 Javascript
jQuery实现响应鼠标事件的图片透明效果【附demo源码下载】
2016/06/16 Javascript
原生js验证简洁注册登录页面
2016/12/17 Javascript
JS异步文件上传(兼容IE8+)
2017/04/02 Javascript
webpack独立打包和缓存处理详解
2017/04/03 Javascript
VUE axios发送跨域请求需要注意的问题
2017/07/06 Javascript
vue中eventbus被多次触发以及踩过的坑
2017/12/02 Javascript
Laravel整合Bootstrap 4的完整方案(推荐)
2018/01/25 Javascript
vue.js系列中的vue-fontawesome使用
2018/02/10 Javascript
Vue.set 全局操作简单示例
2019/09/19 Javascript
vue使用swiper实现中间大两边小的轮播图效果
2019/11/24 Javascript
js实现带箭头的进度流程
2020/03/26 Javascript
Node.js API详解之 tty功能与用法实例分析
2020/04/27 Javascript
在Vue中使用Echarts可视化库的完整步骤记录
2020/11/18 Vue.js
用生成器来改写直接返回列表的函数方法
2017/05/25 Python
解决Django的request.POST获取不到内容的问题
2018/05/28 Python
关于Django ForeignKey 反向查询中filter和_set的效率对比详解
2018/12/15 Python
python 图像的离散傅立叶变换实例
2020/01/02 Python
pytorch 多分类问题,计算百分比操作
2020/07/09 Python
浅谈django不使用restframework自定义接口与使用的区别
2020/07/15 Python
Python文件夹批处理操作代码实例
2020/07/21 Python
windows+vscode安装paddleOCR运行环境的步骤
2020/11/11 Python
Invicta手表官方商店:百年制表历史的瑞士腕表品牌
2019/09/26 全球购物
Nasty Gal英国:美国女性服饰销售网站
2021/03/02 全球购物
简历自我评价模版
2014/01/31 职场文书
财务信息服务专业自荐书范文
2014/02/08 职场文书
党员公开承诺践诺书
2014/03/25 职场文书
党性教育心得体会
2014/09/03 职场文书