聊聊在Servlet中怎么上傳文件
首先對(duì)Servlet上傳文件的簡(jiǎn)單理解
此前,Servlet本身沒(méi)有對(duì)文件上傳提供直接的支持,一般需要使用第三方框架來(lái)實(shí)現(xiàn),這樣就比較麻煩
不過(guò),Servlet3.0之后提供了這個(gè)功能,而且使用非常簡(jiǎn)單,,為此,HTTPServletRequest提供了兩個(gè)方法用于從請(qǐng)求中解析出上傳的文件:
Part getPart(String name) //獲取請(qǐng)求中給定 name 的文件 Collection<Part> getParts() //獲取所有的文件
其中每一個(gè)文件用一個(gè)javax.servlet.http.Part對(duì)象來(lái)表示,該接口提供了處理文件的簡(jiǎn)易方法,如write(),delete(),那么,結(jié)合 HttpServletRequest 和 Part 來(lái)保存上傳的文件變得非常簡(jiǎn)單
Part img = request.getPart("img");
img.write("根路徑+\\img.jpg")
注意:可以配合 @MultipartConfig 注解來(lái)對(duì)上傳操作進(jìn)行一些自定義的配置,比如限制上傳文件的大小,以及保存文件的路徑等,但是,如果請(qǐng)求的 MIME 類型不是 multipart/form-data,則不能使用上面的兩個(gè)方法,否則將拋異常。
首先我們掌握開(kāi)發(fā)Servlet的步驟:
前端:如果有前端內(nèi)容的話,需要再寫一個(gè)html文件
后端
- 首先編寫后臺(tái)的Servlet代碼(也即重寫doGet和doPost方法)
- 配置項(xiàng)目文件,web.xml里面的映射文件
1.首先寫一個(gè)頁(yè)面(前端) html 文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上傳文件</title>
</head>
<body>
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="img"><p>
<input type="submit" value=" 提 交 ">
</form>
</body>
</html>
代碼分析

2.寫Servlet后端類代碼
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
import java.io.PrintWriter;
//首先必須聲明這個(gè)類是用來(lái)處理(文件)流的【不可獲取】
@MultipartConfig
public class FileServlet extends HttpServlet {
@Override
//因?yàn)樘峤槐韱沃恍枰猵ost,那么這里就不需要get方法了
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//首先拿到流信息,他返回的是一個(gè)part對(duì)象
Part part = req.getPart("img");
//手下聲明一個(gè)保存路徑,這里保存在D盤的File文件下
String filePath = "D:\\File\\";
//保存文件的名稱這里就和原文件的名稱一樣,通過(guò)part里面的方法得到原文件名稱
String fileName = part.getSubmittedFileName();
//通過(guò)write方法,可以將這個(gè)png文件保存在任意路徑下,write里面的參數(shù),就是要保存的路徑
part.write(filePath+fileName);
//然后給前端返回響應(yīng)的結(jié)果
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
writer.println("<h1>上傳成功</h1>");
}}
3.配置web.xml映射
<servlet>
<servlet-name>fileServlet</servlet-name>
<servlet-class>FileServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>fileServlet</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>
4.效果展示

存在問(wèn)題
那么哪里存在問(wèn)題呢?
//首先拿到流信息,他返回的是一個(gè)part對(duì)象
Part part = req.getPart("img");
//手下聲明一個(gè)保存路徑,這里保存在D盤的File文件下
String filePath = "D:\\File\\";
//保存文件的名稱這里就和原文件的名稱一樣,通過(guò)part里面的方法得到原文件名稱
String fileName = part.getSubmittedFileName();
//通過(guò)write方法,可以將這個(gè)png文件保存在任意路徑下,write里面的參數(shù),就是要保存的路徑
part.write(filePath+fileName);
注意:其實(shí)這里是存在一點(diǎn)問(wèn)題的

那么如何進(jìn)行改進(jìn)呢?
方法:使用UUID作為文件名

代碼改進(jìn):也就是把代碼中的fileName改成如下
//首先需要一個(gè)文件名,改進(jìn)文件名的名稱(防止重復(fù)名稱覆蓋之前的文件)
String fileName = UUID.randomUUID().toString()+
part.getSubmittedFileName().substring(part.getSubmittedFileName().indexOf("."));
結(jié)果驗(yàn)證:

以上就是聊聊在Servlet中怎么上傳文件的詳細(xì)內(nèi)容,更多關(guān)于Java Servlet上傳文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用Spring靜態(tài)注入實(shí)現(xiàn)讀取配置工具類新方式
這篇文章主要介紹了使用Spring靜態(tài)注入實(shí)現(xiàn)讀取配置工具類新方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
單元測(cè)試 @mock與@SpringBootTest的使用
這篇文章主要介紹了單元測(cè)試 @mock與@SpringBootTest的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Java中LinkedList的模擬實(shí)現(xiàn)
本文主要介紹了Java中LinkedList的模擬實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
SpringBoot用JdbcTemplates操作Mysql實(shí)例代碼詳解
JdbcTemplate是Spring框架自帶的對(duì)JDBC操作的封裝,目的是提供統(tǒng)一的模板方法使對(duì)數(shù)據(jù)庫(kù)的操作更加方便、友好,效率也不錯(cuò),這篇文章主要介紹了SpringBoot用JdbcTemplates操作Mysql2022-10-10
Struts2中圖片以base64方式上傳至數(shù)據(jù)庫(kù)
這篇文章主要介紹了Struts2中圖片以base64方式上傳至數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼,代碼分為前臺(tái)和后臺(tái)兩段,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09

