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 相关文章推荐
functional继承模式 摘自javascript:the good parts
Jun 20 Javascript
js给页面加style无效果的解决方法
Jan 20 Javascript
浅析javascript的间隔调用和延时调用
Nov 12 Javascript
JavaScript使用yield模拟多线程的方法
Mar 19 Javascript
简介JavaScript中substring()方法的使用
Jun 06 Javascript
js格式化时间的简单实例
Nov 27 Javascript
完美的js图片轮换效果
Feb 05 Javascript
深入理解Angularjs中$http.post与$.post
May 19 Javascript
Angularjs为ng-click事件传递参数
Jun 15 Javascript
浅谈react.js中实现tab吸顶效果的问题
Sep 06 Javascript
javascript递归函数定义和用法示例分析
Jul 22 Javascript
vue使用video插件vue-video-player详解
Oct 23 Javascript
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
解决了Ajax、MySQL 和 Zend Framework 的乱码问题
2009/03/03 PHP
PHP远程采集图片详细教程
2014/07/01 PHP
php实现的DateDiff和DateAdd时间函数代码分享
2014/08/16 PHP
php+mysql实现数据库随机重排实例
2014/10/17 PHP
使用PHP Socket 编程模拟Http post和get请求
2014/11/25 PHP
php表单文件iframe异步上传实例讲解
2017/07/26 PHP
添加到收藏夹代码(兼容几乎所有的浏览器)
2007/01/09 Javascript
禁止F5等快捷键的JS代码
2007/03/06 Javascript
通过Jquery遍历Json的两种数据结构的实现代码
2011/01/19 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
邮箱下拉自动填充选择示例代码附图
2014/04/03 Javascript
javascript trim函数在IE下不能用的解决方法
2014/09/12 Javascript
JS在可编辑的div中的光标位置插入内容的方法
2014/11/20 Javascript
解决bootstrap中modal遇到Esc键无法关闭页面
2015/03/09 Javascript
js使用DOM操作实现简单留言板的方法
2015/04/10 Javascript
JS基于Mootools实现的个性菜单效果代码
2015/10/21 Javascript
基于Jquery easyui 选中特定的tab
2015/11/17 Javascript
JavaScript中的原型prototype完全解析
2016/05/10 Javascript
Bootstrap三种表单布局的使用方法
2016/06/21 Javascript
JavaScript兼容浏览器FF/IE技巧
2016/08/14 Javascript
详解javascript表单的Ajax提交插件的使用
2016/12/29 Javascript
JS基于面向对象实现的多个倒计时器功能示例
2017/02/28 Javascript
node.js支持多用户web终端实现及安全方案
2017/11/29 Javascript
Angularjs之如何在跨域请求中传输Cookie的方法
2018/06/01 Javascript
使用angularjs.foreach时return的问题解决
2018/09/30 Javascript
React降级配置及Ant Design配置详解
2018/12/27 Javascript
Vue 自定义标签的src属性不能使用相对路径的解决
2019/09/17 Javascript
小程序实现密码输入框
2020/11/16 Javascript
python基础教程之Hello World!
2014/08/29 Python
深入理解Django-Signals信号量
2019/02/19 Python
Scholastic父母商店:儿童书籍
2017/01/01 全球购物
世界上最伟大的马产品:Equiderma
2020/01/07 全球购物
情人节寄语大全
2014/04/11 职场文书
《爱如茉莉》教后反思
2014/04/12 职场文书
做一个有道德的人活动实施方案
2014/08/23 职场文书
项目安全员岗位职责
2015/02/15 职场文书