利用FormData對象實現AJAX文件上傳功能及后端實現

包括HTML基礎設置、CSS界面優化、JS利用FormData對象和AJAX進行上傳、后端接收文件并存儲到指定路徑以及刪除文件操作。

FE

HTML

基礎的設置:

<form enctype="multipart/form-data"><input id="file" type="file" multiple="multiple" name="file" accept="..."><input type="submit" value="上傳">
</form>
復制代碼

Form的enctype屬性

enctype這個屬性管理的是表單的MIME編碼,它一共有三個屬性:

描述
application/x-www-form-urlencoded在發送前編碼所有字符(默認)
multipart/form-data不對字符編碼,用來制定傳輸數據的特殊類型,如mp3、jpg
text/plain純文本傳輸

因此,傳輸完整的文件數據需要multipart/form-data屬性。

Input

value

保存了用戶指定的文件的名稱。

type="file"

設置input類型為file。

multiple="multiple"

可多選,不設置為單選。

accept="..."

設置可選文件的MIME_type。在設置之后點擊選擇文件按鈕會默認顯示符合設置的MIME_type的文件(存在兼容性)。具體的文件類型對應的MIME類型可以搜索到,這里列出我用到的類型:

文件類型MIME類型
.txttext/plain
.pdfapplication/pdf
.docapplication/msword
.docxapplication/vnd.openxmlformats-officedocument.wordprocessingml.document
.xlsapplication/vnd.ms-excel
.pptapplication/vnd.ms-powerpoint
.pptxapplication/vnd.openxmlformats-officedocument.presentationml.presentation

效果

太丑,不能忍...

CSS

默認界面會在選擇文件按鈕后會跟一個顯示文件名的文本區域,選擇文件按鈕無法編輯。 我修改的方法是將input框隱藏,再設置一個lable標簽使用戶點擊lable標簽時觸發選擇文件按鈕。

<label for="file">選擇文件</label>
復制代碼

效果

JS

在使用from提交時,瀏覽器會向服務器發送選中的文件的內容而不僅僅是發送文件名。

為安全起見,<input type="file">即file-upload 元素不允許 HTML 作者或 JavaScript 程序員指定一個默認的文件名。HTML value 屬性被忽略,并且對于此類元素來說,value屬性是只讀的,這意味著只有用戶可以輸入一個文件名。當用戶選擇或編輯一個文件名時,file-upload 元素觸發 onchange 事件句柄。

利用form提交會導致頁面刷新,體驗不好,所以使用AJAX進行文件上傳是個不錯的選擇。但這需要我們自己來組織通過POST請求發送的內容。

FormData對象

通過FormData對象可以組裝一組用 XMLHttpRequest發送請求的鍵/值對。它可以更靈活方便的發送表單數據,因為可以獨立于表單使用。如果你把表單的編碼類型設置為multipart/form-data ,則通過FormData傳輸的數據格式和表單通過submit() 方法傳輸的數據格式相同。 —— MDN web docs

創建FormData對象

let formData = new FormData();
復制代碼

向實例化對象中添加文件字段

let myFile = document.getElementById('file');
// myFile.file[0]為第一個文件(單選),多個文件(多選)則要循環添加
formData.append('myFile', myFile.files[0]);
復制代碼
console.log(myFile.files[0]);
復制代碼

其中size屬性單位是byte(字節),即b。

添加自定義字段

formData.append('username', 'simmzl');
復制代碼

AJAX發送

let request = new XMLHttpRequest();
request.open("POST", "http://foo.com/foo.php");
request.send(formData);
復制代碼

不使用FromData對象

不使用FormData對象的情況下,需要通過AJAX序列化和提交表單 : Using nothing but XMLHttpRequest

PHP

接收

全局數組 $_FILES,第一個參數是表單的 input name,第二個下標是 "name", "type", "size", "tmp_name" 或 "error"。可以根據這些屬性做相關限制,如限制文件大小、文件類型等

描述
name文件名
type文件的MIME類型
size以字節Byte為單位的文件大小
tmp_namePHP接收文件會存為暫時文件,如需保存到指定路徑還要移動這個暫時文件才可以
error1-7代表7種不同錯誤類別以及0代表成功

error: 成功:0(UPLOAD_ERR_OK) 失敗:

  1. 超過了配置文件上傳文件的大小
  2. 超過了表單設置上傳文件的大小
  3. 文件部分被上傳
  4. 沒有文件被上傳
  5. 沒有找到臨時目錄
  6. 文件不可寫
  7. 由于PHP的擴展程序中斷了文件上傳

驗證

上傳文件是通過POST發送的,is_uploaded_file(file)函數可以判斷指定的文件是否是通過 HTTP POST 上傳的,返回布爾值。

該函數可以用于確保惡意的用戶無法欺騙腳本去訪問本不能訪問的文件,例如 /etc/passwd。 這種檢查顯得格外重要,如果上傳的文件有可能會造成對用戶或本系統的其他用戶顯示其內容的話。

保存

上傳的文件暫存在tmp_name中,需要使用move_uploaded_file(file,newlocation)將上傳的文件移動到指定路徑,返回布爾值。

if( move_uploaded_file($tmp_name, $destination) ) {echo "文件上傳成功";
}else{echo "文件移動失敗";
}
復制代碼

刪除

使用unlink(filepath)刪除文件,參數是文件路徑。

拓展功能

當然除了接收、驗證、保存和刪除這四個基本操作外,還可以添加諸如將文件路徑存入數據庫、生成文件列表等功能,視需求而定。

最初發表于blog.simmzl.cn

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453329.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453329.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453329.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第 6 章 —— 裝飾模式

6.6 裝扮模式總結 裝飾模式把每個要裝飾的功能放在單獨的類中&#xff0c;并讓這個類包裝它所要裝飾的對象&#xff0c;因此&#xff0c;當需要執行特殊行為時&#xff0c;客戶端代碼就可以在運行時根據需要有選擇地、按順序地使用裝飾功能包裝對象了。 裝扮模式是為已有功能動…

廣義表及其存儲方式簡介

廣義表&#xff08;Lists&#xff0c;又稱列表&#xff09;是線性表的推廣。線性表定義為n>0個元素a1,a2,a3,…,an的有限序列。線性表的元素僅限于原子項&#xff0c;原子是作為結構上不可分割的成分&#xff0c;它可以是一個數或一個結構&#xff0c;若放松對表元素的這種限…

Vue.js:路由

ylbtech-Vue.js&#xff1a;路由1.返回頂部 1、Vue.js 路由 本章節我們將為大家介紹 Vue.js 路由。 Vue.js 路由允許我們通過不同的 URL 訪問不同的內容。 通過 Vue.js 可以實現多視圖的單頁Web應用&#xff08;single page web application&#xff0c;SPA&#xff09;。 Vue.…

圖片轉excel:“保留數字格式”在什么場景下該勾

保留數字格式是什么意思呢&#xff1f;顧名思義&#xff0c;就是將轉出來的數字保留為數字格式&#xff0c;而不是文本格式。我們知道&#xff0c;OCR程序將圖片上的文字識別為電腦可編輯的文字后&#xff0c;如果導入到excel不加處理&#xff0c;則單個數字過長的文字就會被ex…

html概述和基本結構

html概述 HTML是 HyperText Mark-up Language 的首字母簡寫&#xff0c;意思是超文本標記語言&#xff0c;超文本指的是超鏈接&#xff0c;標記指的是標簽&#xff0c;是一種用來制作網頁的語言&#xff0c;這種語言由一個個的標簽組成&#xff0c;用這種語言制作的文件保存的是…

linux添加三權,基于SELinux的三權分離技術的研究

目前&#xff0c;Linux操作系統已廣泛應用于各種設備和產品中&#xff0c;如服務器、PC機、機頂盒及路由器等。隨著Linux系統的不斷發展和廣泛應用&#xff0c;Linux系統的安全問題也引起越來越多的關注。在Linux操作系統中&#xff0c;存在一個超級用戶即root用戶。root也稱為…

二叉樹、樹和有序樹的區別

樹&#xff1a;子樹沒有左右之分 二叉樹、有序樹:左右有序 二叉樹與有序樹&#xff1a;在只有一棵樹的情況下&#xff0c;二叉樹有左右之分、有序樹無左右之分 另外&#xff1a;二叉樹是有序的&#xff0c;可以為空或一個根節點以及兩個分別稱為左子樹和右子樹的互不相交的二叉…

高效程序員

軟件開發人員的作戰手冊 - 讓程序員活的久一點 1. 程序員的職業準則是&#xff1a;誠實&#xff08;如實的報告你的狀態&#xff0c;風險和出現的問題&#xff09;&#xff0c;守信&#xff08;承諾完成的任務就要按時完成&#xff09;&#xff0c;尊重&#xff08;尊重給你的代…

PHP學習筆記1

1.什么是PHP&#xff1f; Hypertext Preprocessor(超文本預處理語言)。 是腳本語言。 是最流行的網站開發語言。 2.PHP能做什么&#xff1f; 可以生成動態頁面內容。 可以創建、打開、讀取、寫入、關閉服務器上的文件。 可以手機表單數據。 可以發送和接收cookies。&#xf…

Redis在windows下的配置

原文:Redis在windows下的配置 Redis在windows下的配置&#xff08;在windows-64下安裝redis&#xff0c;請參考微軟redis的github&#xff1a;https://github.com/MSOpenTech/redis/releases&#xff09;下面是windows32的配置 下載地址http://files.cnblogs.com/files/cuiweny…

linux磁盤符變化autofs,Linux基礎教程學習筆記之Autofs自動掛載

Linux基礎教程學習筆記之Autofs自動掛載Autofs自動掛載&#xff1a;yum -y install autofsvim /etc/auto.master 在文件中添加下面行/home/guests /etc/auto.tianyunvim /etc/auto.tianyun 子掛載點監控ldapuser0 -rw,sync classroom:/home/guests/ldapuser0systemctl enable …

二叉樹的遞歸遍歷(先序,中序,后序)

#include "stdio.h" #include "malloc.h" #define M 100 typedef struct node { /* 采用二叉鏈表存儲結構 */char data;struct node *lchild,*rchild; }BTnode; BTnode *create()/*利用先序遍歷的過程創建二叉樹*/ {BTnode *t;char ch;scanf("%c&quo…

DOM-動態操作心得

這個知識點都是之前看過的,就當是復習了 一、創建元素的三種方法 第一種: document.write() 識別標簽但會覆蓋之前內容第二種: 用元素自身的innerHTML方法 不識別標簽但可以不覆蓋之前內容 ul.innerHTML "<li></li>"; 第三種:利用DOM自身api創建元素 …

linux探索之旅pdf,【Linux探索之旅】第四部分第一課:壓縮文件,解壓無壓力

內容簡介1、第四部分第一課&#xff1a;壓縮文件&#xff0c;解壓無壓力2、第四部分第二課&#xff1a;SSH連接&#xff0c;安全快捷壓縮文件&#xff0c;解壓無壓力最近小編因為換工作&#xff0c;從南法搬到巴黎。折騰了很久。網絡一直用的是公共的無線網&#xff0c;信號不行…

遍歷二叉樹的全部方法(遞歸+非遞歸)

#include<iostream> #include<queue> #include<stack> using namespace std; //二叉樹結點的描述 typedef struct BiTNode { char data; struct BiTNode *lchild, *rchild; //左右孩子 }BiTNode,*BiTree; //按先序遍…

如何在本地搭建一個Android應用crashing跟蹤系統-ACRA

https://github.com/bboyfeiyu/android-tech-frontier/tree/master/others/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%9C%AC%E5%9C%B0%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AAAndroid%E5%BA%94%E7%94%A8crashing%E8%B7%9F%E8%B8%AA%E7%B3%BB%E7%BB%9F%EF%BC%8DACRA 如何在本地搭建一個Andr…

20165222第一周查漏補缺

一&#xff0c;第一章要點總結 1&#xff0c;java的特點&#xff1a;面向對象&#xff0c;動態&#xff0c;平臺無關。 2&#xff0c;對于帶包程序的編譯&#xff1a;注意javac -d 編譯到一個文件夾內&#xff0c;然后java -cp 文件夾名 包名.類名。 第一章是比較簡單的&#x…

學習中的十七條建議

作者&#xff1a;孤劍 對于一個自學的人來說&#xff0c;幾條規則當然是必要的了&#xff0c;以下是我自己的一些心得。 1。自信是你成功的第一要素&#xff1b; 2。用心去學&#xff0c;活學活用&#xff1b; 3。新手不要“好高騖遠”&#xff0c;老手不要“驕傲自大”&#x…

tp5 linux路由不跳轉,thinkphp5路由不生效一直跳到首頁的解決方法

自從用laravel框架后&#xff0c;好久沒用過thinkphp框架了&#xff0c;早期用的3.x系列&#xff0c;想熟悉一下thinkphp5&#xff0c;結果入坑了&#xff1b;路由配置一直不起作用&#xff0c;總是跳到首頁&#xff0c;折騰了好久&#xff0c;后來發現是nginx配置的問題&#…

stack堆棧簡介

stack堆棧簡介 堆棧是一個線性表&#xff0c;插入和刪除只在表的一端進行。這一端稱為棧頂(Stack Top)&#xff0c;另一端則為棧底(Stack Bottom)。堆棧的元素插入稱為入棧&#xff0c;元素的刪除稱為出棧。由于元素的入棧和出棧總在棧頂進行&#xff0c;因此&#xff0c;堆棧是…