前言

  在 上一篇 已经实现了图片预览,那么如何上传图片呢?有两种思路:

  1、将图片转化为dataURL(base64),这样就成为了一串字符串,再传到服务端。不过这样缺点很多,数据量比转换之前增加1/3,而且会增加了存储开销(如果存在数据库,就多了访问数据库;如果解析成图片再存储,就多了解析的开销)。所以这样方式不可取。

  2、使用formData对象进行上传。

FormData对象

  先看MDN上对FormData对象的介绍:XMLHttpRequest Level 2添加了一个新的接口FormData.利用FormData对象,我们可以通过JavaScript用一些键值对来模拟一系列表单控件,我们还可以使用XMLHttpRequest的send()方法来异步的提交这个"表单".比起普通的ajax,使用FormData的最大优点就是我们可以异步上传一个二进制文件

  构造formData

//
var formData = new FormData(formDOM); //
var formData = new FormData();
formData.append(name , value , fileName)

  在上篇的例子中,创建input的formData对象

var fileInput = document.querySelector('.input-file');
var files = fileInput.files var formData = new FormData(); //创建formData对象 //判断数据 若有 则添加数据
if(files.length > ){
[].slice.call(files).forEach(function(value,index){
formData.append('img' + index,value,value.name) //遍历添加数据
})
}else {
alert('请先选择图片');
return false;
}

  注意:查看formData对象数据需要用get()或者getAll()方法,直接打印出来是{}的。

  弄好了formData对象,再XMLHttpRequest提交到服务端,这里先写一个最简单的上传图片的接口。node小白,请不要吐槽这个粗糙到极致的接口,只是为了测试上传而已。

formidable = require('formidable'); //载入formidable
var express = require('express');
var app = express(); app.use(express.static('src',{ // 静态资源中间件
setHeaders : function(res,path,stat){
res.setHeader('Cache-Control', 'max-age=' + 6000);
}
})); app.post('/upload',function(req,res){
var form = new formidable.IncomingForm();
form.encoding = 'utf-8';
form.uploadDir = './src/images';
form.keepExtensions = true; form.parse(req,function(err,field,files){
console.log(files);
});
res.send({
'msg':'upload file'
});
}); var server = app.listen(8081, function(){
console.log('服务器已启动!');
});

上传

 1、原生上传

  此时的 Content-Type应该为multipart/form-data,原生方式的时候不需要添加也可以,浏览器会自动完成。

      var httpDemo = new XMLHttpRequest(); //创建httprequest对象

      httpDemo.open('post','/upload',true); //初始化请求  post方式  接口  异步
httpDemo.onload = function(e){
console.log(e);
} httpDemo.send(formData); //发送请求

  查看效果,选择的图片已成功上传到指定的目录。

 2、$.ajax()

 使用jquery上传有两个配置需要注意:

  processData会默认将data转化为字符串,所以需要配置为false,不进行处理。

  contentType默认值为application/x-www-form-urlencoded; charset=UTF-8'。上传文件时,Content-Type应该为multipart/form-data。但是设置为multipart/form-data也还是会失败。只有设置为false才可以。

$.ajax({
url : '/upload',
type:'POST',
data: formData,
processData:false,
contentType:false
,
success:function(data,textStatus,jqXHR){ },
error:function(jqXHR,textStatus,error){ }
})

  查看效果,依旧可以上传成功。

 3、vue-axios上传

  只需要配置header即可。

        headers: {
'Content-Type': 'multipart/form-data'
},

formData实现图片上传的更多相关文章

  1. (转)React Native 使用react-native-image-picker库实现图片上传功能

    react-native-image-picker作为一个集成相机和相册的功能的第三方库,因为其使用相对简单受到前端开发人员的喜爱. react-native-image-picker使用 首先,安装 ...

  2. 项目回顾3-再谈图片上传-FormData+ajax上传

    上次在纠结图片上传用base64还是form表单,现在感觉好蠢,因为又开辟了第三条道路. 其实也根本用不到form 只需要一个上传文件的input就好了 <input id="file ...

  3. base64格式图片转换为FormData对象进行上传

    原理:理由ArrayBuffer.Blob和FormData var base64String = /*base64图片串*/; //这里对base64串进行操作,去掉url头,并转换为byte va ...

  4. Formdata 图片上传 Ajax

    /*图片上传*/ $("点击对象").bind("click", function(e){ $('#form-upload').remove(); $('bod ...

  5. ASP.NET Core 简单实现七牛图片上传(FormData 和 Base64)

    ASP.NET Core 简单实现七牛图片上传(FormData 和 Base64) 七牛图片上传 SDK(.NET 版本):https://developer.qiniu.com/kodo/sdk/ ...

  6. 图片上传前预览、压缩、转blob、转formData等操作

    直接上代码吧: <template> <div> <div class="header">添加淘宝买号</div> <div ...

  7. ssm使用Ajax的formData进行异步图片上传返回图片路径,并限制格式和大小

    之前整理过SSM的文件上传,这次直接用代码了. 前台页面和js //form表单 <form id= "uploadForm" enctype="multipart ...

  8. 使用FormData数据做图片上传: new FormData() canvas实现图片压缩

    使用FormData数据做图片上传: new FormData()       canvas实现图片压缩 ps: 千万要使用append不要用set   苹果ios有兼容问题导致数据获取不到,需要后台 ...

  9. 页面表单里的图片上传ENCTYPE="multipart/form-data"

    ENCTYPE="multipart/form-data"用于表单里有图片上传. <form action="<%=basePath %>asyUplo ...

随机推荐

  1. day2_python的数据类型,sys,os模块,编码解码,列表,字典

    今天主要了解了python的数据类型,sys,os模块,编码解码,列表,字典 1.数据类型:int(python3没有长整型)文本总是Unicode,str表示二进制用byte类表示布尔型:True( ...

  2. 【转】CPU与内存的那些事

    下面是网上看到的一些关于内存和CPU方面的一些很不错的文章. 整理如下: 转: CPU的等待有多久? 原文标题:What Your Computer Does While You Wait 原文地址: ...

  3. 【Win 10 应用开发】在代码中加载文本资源

    记得前一次,老周给大伙,不,小伙伴们介绍了如何填写 .resw 文件,并且在 XAML 中使用 x:Uid 标记来加载.也顺便给大伙儿分析了运行时是如何解析 .resw 文件的. 本来说好了,后续老周 ...

  4. (转)Java开发中的23种设计模式详解

    原文出自:http://blog.csdn.net/zhangerqing 一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型 ...

  5. 使用脚本监控windows服务的方法

    以下脚本可监控某一个windows服务,发现其停止就立即重启之. @echo off rem 定义循环间隔时间和监测的服务: set secs=60 set srvname="NetWin ...

  6. WebUploader在谷歌浏览器中反应缓慢迟钝

    修改  初始化webuploader的 js accept: { title: 'Images', extensions: 'jpg,jpeg,png', mimeTypes: 'image/*' } ...

  7. 在mac OS10.10下安装 cocoapods遇到的一些问题

    今天有个朋友问了我一个问题:为什么我安装cocoapods不成功,报 sh: line 1: 997 Abort trap: 6 /Applications/Xcode.app/Contents/De ...

  8. HDU1166 敌兵布阵(树状数组)

    C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于 ...

  9. Codeforces Round #203 (Div. 2)B Resort

    Resort Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Stat ...

  10. Being a Good Boy in Spring Festival(尼姆博弈)

    Being a Good Boy in Spring Festival Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 ...