日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

模拟文件上传(一):手动文件上传

發(fā)布時間:2023/11/27 生活经验 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模拟文件上传(一):手动文件上传 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

關于上傳文件,首先我的第一個案例是一個文本文件的上傳,簡單容易上手!

首先我們上傳文件肯定就屬于實體內容部分了;所以不能過GET方式請求了,要通過POST方式請求;

因為:

1.get方式是URL傳值,URL長度是有限的,很短,并且實體內容只能通過POST傳遞;因為只有POST方式才有content-type屬性。

2.因為是實體內容,所以不能通過getParameter這么草率沒腦子的步驟去得到上傳文件的內容了,要通過獲得request的InputStream來得到實體內容:(插播一個,在序列化的時候之后,網(wǎng)絡傳輸對象我之前沒有思路,這里看來也應該通過流的方式)。

?

其次:

1.我們要注意的是上傳也是一個input標簽,表單上傳,但是type就是填寫file(當我們點擊這個file類型的input的時候,就會自動彈出選擇文件的窗口)。

2.我們還要注意,form中其實是可以設置加密的類型格式:entype;

默認是這么一個玩意兒:entype="application/x-www-form-urlencoded"

但是這樣的話只會以鍵值對的方式傳上文件的名字,在瀏覽器的開發(fā)者模式下就可以查看到,很尷尬!


所以我們要把entype修改為:multipart/form-data;

修改之后,就可以看到長度變長了:并且可用看到實際傳入了值;

長度變長了:


content-type有了實際的值:


實際查看也可以看到POST請求帶到服務器的內容:


首先貼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方式的時候實體部分沒有內容使用post方式的時候實體部分有了內容文件屬于實體內容,不能通過URL進行傳遞,只能通過POST所以不能用GET方式請求發(fā)現(xiàn)我點擊上傳之后,上傳的不是內容而是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;
/*** 模擬服務器處理上傳過來的文件(手動解析文件的內容)* @author mzy**/
public class UpLoadDemo01 extends HttpServlet {private static final long serialVersionUID = -6589048171165363182L;public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1) 獲取實體 內容InputStream in = request.getInputStream();// 包裝成BufferdReader來簡化操作!BufferedReader br = new BufferedReader(new InputStreamReader(in));// 讀取一行/** 回憶:* 		在POST中的實體內容中查看;* 		我們發(fā)現(xiàn),其中的實體內容中在文件內容的* 		開始和結束的時候,都有一段分割符* 在火狐中開發(fā)模式下抓到的實體內容如下:* -----------------------------41184676334* Content-Disposition: form-data; name="attachment"; filename="mzy_test_attach.txt"* Content-Type: text/plain* * aaa* bbb* ccc* * hello world!!!* -----------------------------41184676334--*/// 讀第一行:文件開始的分隔符:將開始分隔符保存起來// 為什么呢?// 因為我們可以從上面的實體內容中看到:// 結束符號就比開始符號最后多兩根橫杠(我們就可以定位到結束位置)String fileTag = br.readLine();// 讀第二行:第二行就是文件的名稱了String str = br.readLine();// 獲取文件的名稱:// 在下覺得這個獲取文件名稱很精彩!// System.out.println(str);String fileName = str.substring(str.indexOf("filename=\"")+10, str.length()-1);/** 但是上面的fileName:* 		最終截取出來的名字要注意;* 		在火狐或者chrome內核中,只有文件名!* 		但是在IE中包含著文件在客戶端上的物理路徑信息;* 		所以如果是IE的話還要再次截取!*/if(fileName.contains("\\")) {// System.out.println(fileName);fileName = fileName.substring(fileName.lastIndexOf("\\")+1, fileName.length());}// 之后需要跳過兩行無用行:// 1.第一行是讀取的格式的聲明Content-Type;// 2.第二行是正文開始之前的空行(默認會加一個空行)br.readLine();br.readLine();// 正式開始讀取文件的正文內容String content = null;// new 一個writer將用戶上傳的文件寫入到我的服務器的盤符上BufferedWriter bw = new BufferedWriter(new FileWriter("e:/"+fileName));while((content=br.readLine()) != null) {// 寫出到服務器上:遇到結束符號結束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中調用doPost,恩?恩?恩?是個傻子。* doPost(request, response);*/doGet(request, response);}}



?

?

?

?

?

?

?

轉載于:https://www.cnblogs.com/mzywucai/p/11053460.html

總結

以上是生活随笔為你收集整理的模拟文件上传(一):手动文件上传的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。