模拟文件上传(一):手动文件上传
關(guān)于上傳文件,首先我的第一個(gè)案例是一個(gè)文本文件的上傳,簡單容易上手!
首先我們上傳文件肯定就屬于實(shí)體內(nèi)容部分了;所以不能過GET方式請求了,要通過POST方式請求;
因?yàn)?#xff1a;
1.get方式是URL傳值,URL長度是有限的,很短,并且實(shí)體內(nèi)容只能通過POST傳遞;因?yàn)?span style="color:#cc0000;">只有POST方式才有content-type屬性。
2.因?yàn)槭菍?shí)體內(nèi)容,所以不能通過getParameter這么草率沒腦子的步驟去得到上傳文件的內(nèi)容了,要通過獲得request的InputStream來得到實(shí)體內(nèi)容:(插播一個(gè),在序列化的時(shí)候之后,網(wǎng)絡(luò)傳輸對象我之前沒有思路,這里看來也應(yīng)該通過流的方式)。
?
其次:
1.我們要注意的是上傳也是一個(gè)input標(biāo)簽,表單上傳,但是type就是填寫file(當(dāng)我們點(diǎn)擊這個(gè)file類型的input的時(shí)候,就會自動彈出選擇文件的窗口)。
2.我們還要注意,form中其實(shí)是可以設(shè)置加密的類型格式:entype;
默認(rèn)是這么一個(gè)玩意兒:entype="application/x-www-form-urlencoded"
但是這樣的話只會以鍵值對的方式傳上文件的名字,在瀏覽器的開發(fā)者模式下就可以查看到,很尷尬!
所以我們要把entype修改為:multipart/form-data;
修改之后,就可以看到長度變長了:并且可用看到實(shí)際傳入了值;
長度變長了:
content-type有了實(shí)際的值:
實(shí)際查看也可以看到POST請求帶到服務(wù)器的內(nèi)容:
首先貼jsp中的顯示層的代碼:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>文件上傳</title></head><body><%--在瀏覽器的開發(fā)模式下查看:使用get方式的時(shí)候?qū)嶓w部分沒有內(nèi)容使用post方式的時(shí)候?qū)嶓w部分有了內(nèi)容文件屬于實(shí)體內(nèi)容,不能通過URL進(jìn)行傳遞,只能通過POST所以不能用GET方式請求發(fā)現(xiàn)我點(diǎn)擊上傳之后,上傳的不是內(nèi)容而是name和value的鍵值對:attachment=java8混合模式.txt 【諸如此類的】原因就是form中的enctype影響的! enctype="application/x-www-form-urlencoded"要修改編碼類型:multipart/form-data從鍵值對變成了:multipart/form-data; boundary=----WebKitFormBoundary9qkZBbwklcwsP0yC--%><%-- <form action="01.upload.jsp" method="POST" enctype="application/x-www-form-urlencoded"> --%><%-- <form method="POST" enctype="multipart/form-data"> --%><form action="${pageContext.servletContext.contextPath }/servlet/UpLoadDemo01" method="POST" enctype="multipart/form-data">請選擇要上傳的文件:<input type="file" name="attachment" /><input type="submit" value="上傳文件"/></form></body>
</html>
?
servlet中處理的邏輯代碼:
package upload;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*** 模擬服務(wù)器處理上傳過來的文件(手動解析文件的內(nèi)容)* @author mzy**/
public class UpLoadDemo01 extends HttpServlet {private static final long serialVersionUID = -6589048171165363182L;public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1) 獲取實(shí)體 內(nèi)容InputStream in = request.getInputStream();// 包裝成BufferdReader來簡化操作!BufferedReader br = new BufferedReader(new InputStreamReader(in));// 讀取一行/** 回憶:* 在POST中的實(shí)體內(nèi)容中查看;* 我們發(fā)現(xiàn),其中的實(shí)體內(nèi)容中在文件內(nèi)容的* 開始和結(jié)束的時(shí)候,都有一段分割符* 在火狐中開發(fā)模式下抓到的實(shí)體內(nèi)容如下:* -----------------------------41184676334* Content-Disposition: form-data; name="attachment"; filename="mzy_test_attach.txt"* Content-Type: text/plain* * aaa* bbb* ccc* * hello world!!!* -----------------------------41184676334--*/// 讀第一行:文件開始的分隔符:將開始分隔符保存起來// 為什么呢?// 因?yàn)槲覀兛梢詮纳厦娴膶?shí)體內(nèi)容中看到:// 結(jié)束符號就比開始符號最后多兩根橫杠(我們就可以定位到結(jié)束位置)String fileTag = br.readLine();// 讀第二行:第二行就是文件的名稱了String str = br.readLine();// 獲取文件的名稱:// 在下覺得這個(gè)獲取文件名稱很精彩!// System.out.println(str);String fileName = str.substring(str.indexOf("filename=\"")+10, str.length()-1);/** 但是上面的fileName:* 最終截取出來的名字要注意;* 在火狐或者chrome內(nèi)核中,只有文件名!* 但是在IE中包含著文件在客戶端上的物理路徑信息;* 所以如果是IE的話還要再次截取!*/if(fileName.contains("\\")) {// System.out.println(fileName);fileName = fileName.substring(fileName.lastIndexOf("\\")+1, fileName.length());}// 之后需要跳過兩行無用行:// 1.第一行是讀取的格式的聲明Content-Type;// 2.第二行是正文開始之前的空行(默認(rèn)會加一個(gè)空行)br.readLine();br.readLine();// 正式開始讀取文件的正文內(nèi)容String content = null;// new 一個(gè)writer將用戶上傳的文件寫入到我的服務(wù)器的盤符上BufferedWriter bw = new BufferedWriter(new FileWriter("e:/"+fileName));while((content=br.readLine()) != null) {// 寫出到服務(wù)器上:遇到結(jié)束符號結(jié)束if(content.equals(fileTag+"--")) {break;// continue; 都可以}bw.write(content);bw.newLine(); // 換行bw.flush();}bw.close();br.close();}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");/** 我今天傻逼了在doPost中調(diào)用doPost,恩?恩?恩?是個(gè)傻子。* doPost(request, response);*/doGet(request, response);}}
?
?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/mzywucai/p/11053460.html
總結(jié)
以上是生活随笔為你收集整理的模拟文件上传(一):手动文件上传的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于医院挂水
- 下一篇: 【转载】Linux 软件安装到 /usr