new FormData() 前端上傳文件圖片到服務器


關於FormData

XMLHttpRequest Level 2添加了一個新的接口FormData.利用FormData對象,我們可以通過JavaScript用一些鍵值對來模擬一系列表單控件,我們還可以使用XMLHttpRequest的send()方法來異步的提交這個"表單".比起普通的ajax,使用FormData的最大優點就是我們可以異步上傳一個二進制文件.

所有主流瀏覽器的較新版本都已經支持這個對象了,比如Chrome 7+、Firefox 4+、IE 10+、Opera 12+、Safari 5+。

用處

上傳文件的格式一般是

  • base64格式
  • new FormData (ios,andorid只支持FormData 卻不支持base64)

網上通俗的教程

通過傳統的form表單提交的方式上傳文件:

<form id= "uploadForm" action= "http://localhost:8080/cfJAX_RS/rest/file/upload" method= "post" enctype ="multipart/form-data"> <h1 >測試通過Rest接口上傳文件 </h1> <p >指定文件名: <input type ="text" name="filename" /></p> <p >上傳文件: <input type ="file" name="file" /></p> <p >關鍵字1: <input type ="text" name="keyword" /></p> <p >關鍵字2: <input type ="text" name="keyword" /></p> <p >關鍵字3: <input type ="text" name="keyword" /></p> <input type ="submit" value="上傳"/> </form> 復制代碼

不過傳統的form表單提交會導致頁面刷新,但是在有些情況下,我們不希望頁面被刷新,這種時候我們都是使用Ajax的方式進行請求的。

目前很多框架都不簡單的html格式,更多是vue + axios(ajax) / react + ajax方式來提交

新框架formData()新用法

var formData = new FormData(); // 利用append的內置方式 formData.append("username", "Groucho"); formData.append("accountnum", 123456); // 數字 123456 會被立即轉換成字符串 "123456" formData.append("userfile", fileInputElement.files[0]); $.ajax({ url : "http://localhost:8080/STS/rest/user", type : "POST", data : formData, success : function(data) { console.log(data) }, error : function(data) { console.log(data) } }); 

注意:直接打印會獲取空

 

 

W3c草案提供了三種方案來獲取或修改FormData。

想得到一個FormData對象:

var formdata = new FormData();

方案1:創建一個空的FormData對象,然后再用append方法逐個添加鍵值對:
var formdata = new FormData();
formdata.append("name", "呵呵"); formdata.append("url", "http://www.baidu.com/"); 復制代碼
方案2:取得form元素對象,將它作為參數傳入FormData對象中!
var formobj =  document.getElementById("form"); var formdata = new FormData(formobj); 復制代碼
方案3:利用form元素對象的getFormData方法生成它!
var formobj =  document.getElementById("form"); var formdata = formobj.getFormData() 復制代碼

FormData 內置API方法

  • FormData.append
  • FormData.delete
  • FormData.get
  • FormData.getAll
  • FormData.has
  • FormData.set

node koa2接受前端FormData()的傳值

const Koa = require('koa') const koaBody = require(‘koa-body’); Koa(koaBody({multipart: true})); 復制代碼

koa2后台操作

// router.js
.post(Api('uploadImage'), lib.uploadImage) // router_api.js exports.uploadImage = async(ctx, next)=> { let body = ctx.request.body; let articleId = body.fields.articleId; let image = body.files.image; let filename = image.name; let avatarName = Date.now() + '_' + filename; let readStream = fs.createReadStream(image.path) let writeStream = fs.createWriteStream(uploadDir + avatarName); readStream.pipe(writeStream); ctx.body = {flag: '1' ,msg:'',data: {url: config[env].host + '/' + uploadDir + avatarName}} } // ctx.body 返回url 保存到koa文件中的public的圖片路徑

 

 

 

 

 

.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM