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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 文件上传 servlet_java文件上传-原始的Servlet方式

發(fā)布時間:2023/12/2 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 文件上传 servlet_java文件上传-原始的Servlet方式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言:

干了這幾個項目,也做過幾次文件上傳下載,要么是copy項目以前的代碼,要么是百度的,雖然做出來了,但學習一下原理弄透徹還是很有必要的。剛出去轉(zhuǎn)了一圈看周圍有沒有租房的,在北京出去找房子是心里感覺最不爽的時候,沒有歸屬感,房租還不便宜,RT,不能好高騖遠,還是腳踏實地一點一點學技術吧,終將有一日,工資會漲的。

java文件上傳

傳統(tǒng)的文件上傳,不用jquery插件的話,就是用form表單提交,項目里用過uploadify,可以異步上傳文件,原理我也沒研究?,F(xiàn)在說傳統(tǒng)的form表單上傳文件。

文件上傳核心:

用 來聲明一個文件域。樣式如 ?文件:_____ .

必須使用post方式提交表單。

必須設置表單的類型為multipart/form-data.是設置這個表單傳遞的不是key=value值。傳遞的是字節(jié)碼.

新建web項目:

jsp form表單:enctype(編碼類型)的默認值就是?application/x-www-form-urlencoded

瀏覽器查看 http報文:

主要參數(shù):

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 ? ?接收服務器返回的類型,*/*表示所有。

Referer:http://localhost:8888/upload/ ? ?來自哪個網(wǎng)站

Accept-Language:zh-CN,zh;q=0.8 :請求回應中首選的語言為簡體中文

Accept-Encoding:gzip, deflate, br支持的壓縮格式

User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36 ??用戶瀏覽器類型

Host:localhost:8888 主機地址

Connection:keep-alive?報文發(fā)送完畢后仍然保持連接

Cache-Control:max-age=0 ?緩存

Content-Length:41 41字節(jié)

對文件上傳來說,重要的參數(shù)是:

Content-Type:application/x-www-form-urlencoded

這個參數(shù)只有post請求才有,默認就是application/x-www-from-urlencoded ,Content-type表示正文類型,get方式?jīng)]有正文,因為參數(shù)在url里。

在Servlet里可以用request對象取到Content-type:request.getHeader("Content-type"); 默認的值為 application/x-www-form-urlencoded,

如果是get請求,則request.getHeader("Content-type");為null。

下圖是get請求時的http頭信息,參數(shù)再url傳遞,沒有Content-type

文件上傳,必須設置enctype="multipart/form-data"

from表單:

上傳一個word:

此時的http消息的Content-Type:

其中的 boundary=----WebKitFormBoundary44gVxAkoSg3tk3oR 指的是文件上傳的分隔符。在請求正文里體現(xiàn)。

看請求的正文:

-----xxxxxxxxxx 標識文件開始,最后一行的 --------xxxxxxxxxxxx--(分隔符末尾多了2個--),標識文件結束。第一個input 是text類型,第二個是二進制,content-type 是application/octet-stream 表示 二進制流。如果選擇的是圖片,Content-Type: image/jpeg,文本則,Content-Type: text/plain。

二進制流的接收:

當表單類型是post類型,切enctype="multipart/form-data",則所有的數(shù)據(jù)都是以二進制流的形式向服務器上傳,所以request.getParameter("xxx") 永遠為null,只能通過req.getInputStream(); 獲取正文。

上傳一個txt:

Servlet:

packagecom.lhy.upload;importjava.io.BufferedReader;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.OutputStream;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/***

*@authorAdministrator

**/@WebServlet(name="UploadServlet",urlPatterns="/UploadServlet")public class UploadServlet extendsHttpServlet{

@Overrideprotected voiddoGet(HttpServletRequest req, HttpServletResponse resp)throwsServletException, IOException {//this.doPost(req, resp);

}

@Overrideprotected voiddoPost(HttpServletRequest req, HttpServletResponse resp)throwsServletException, IOException {

req.setCharacterEncoding("UTF-8");

String contentType= req.getHeader("Content-type");

System.out.println("contentType: "+contentType);

String name= req.getParameter("name");

System.out.println(name);//null

InputStream is=req.getInputStream();//------WebKitFormBoundaryG0ULv7eVfQ1K2PBA//Content-Disposition: form-data; name="image"; filename="靜夜思.txt"//Content-Type: text/plain//

//

//------WebKitFormBoundaryG0ULv7eVfQ1K2PBA--

BufferedReader br = new BufferedReader(newInputStreamReader(is));

String firstLine= br.readLine();//第一行,分隔符

String fileName =br.readLine();//Content-Disposition: form-data; name="image"; filename="jingyesi.txt"

fileName = fileName.substring(fileName.lastIndexOf("=")+2,fileName.length()-1);

br.readLine();

br.readLine();

String data= null;//獲取當前項目的運行路徑

String path = getServletContext().getRealPath("/up");

PrintWriter pw= new PrintWriter(path+"/"+fileName);while((data = br.readLine()) != null){if(data.equals(firstLine+"--")){break ; //讀到了文件尾

}

pw.println(data);

}

pw.flush();

pw.close();

is.close();/*FileOutputStream fos = new FileOutputStream(path+"/"+"b.doc");

// byte[] b = new byte[1024];

int len = 0;

while((len = is.read()) != -1){

fos.write(len);

}

fos.flush();

fos.close();

is.close();*/}

}

項目里:

例子只是讀取了txt,其他的二進制需要使用inputStream讀取。

我讀取了圖片寫到項目里,打不開,大小比原始圖片會小一點,不知為何

歡迎關注個人公眾號一起交流學習:

總結

以上是生活随笔為你收集整理的java 文件上传 servlet_java文件上传-原始的Servlet方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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