被文件上傳弄得焦頭爛額的一天,果然web中的路徑和各種設置真的好討厭= =
下面是超級小白的、及其簡約的“詳”解
1、明確目的:
用戶將 1.txt 文件 上傳到 服務器(web工程下的某個文件夾)中
2、明確過程
文件上傳的過程涉及兩個文件, 一個 .jsp文件,和 一個 servlet 文件。
.jsp文件(upload.jsp):用戶操作頁面 =顯示文件名的文本框+文件選擇按鈕(瀏覽...)+確認上傳按鈕
servlet文件(uploadServlet.java):根據.jsp中選擇的文件,處理文件上傳
3、開始敲代碼(掀桌!)
.jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文件上傳</title>
</head>
<body>
<form action="upload.do" enctype="multipart/form-data" method="post"> //關鍵句1
<table>
<tr> <td>文件名:</td>
<td><input type="file" name="fileName" size="30" /></td> //關鍵句2
</tr>
<tr>
<td><input type="submit" value="上傳" /></td>
</tr>
</table>
</form>
</body>
</html>
.jsp中的關鍵語句:
關鍵句1:<form action="upload.do" enctype="multipart/form-data" method="post"> //form中的數據用二進制數據傳輸,可以傳文字,圖片,。。
關鍵句2:<input type="file" name="fileName" size="30" /> //type 設成“file”就是文件選擇按鈕,自動產生一個 文本框+選擇按鈕
servlet文件:
import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; @WebServlet(name = "UploadServlet", urlPatterns = { "/upload.do" }) public class UploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; public UploadServlet() { super(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); String path = this.getServletContext().getRealPath("/"); // path為工程根目錄:(web工程名為test) // D:\tomcat\apache-tomcat-8.0.50-windows-x64\apache-tomcat-8.0.50\webapps\test\ Part part = request.getPart("fileName");// part代表一個文件
String h = part.getHeader("content-disposition"); // h是要上傳的文件的頭:具體如下(上傳桌面上的account.txt文件) // form-data; name="fileName"; filename="C:\Users\ASUS\Desktop\account.txt" //把傳上來的account.txt文件命名為"newFile"保存在服務器中 String fname = "newFile"; //substring是在獲取文件的后綴,改名但是不改后綴 fname = fname + h.substring(h.lastIndexOf("."), h.length() - 1); //按照路徑上傳文件(修改path可以改變文件在服務器中的存儲位置) part.write(path + "\\" + fname); //提示上傳成功 PrintWriter out = response.getWriter(); out.println("<html><head>"); out.println("<title>上傳文件</title></head>"); out.println("<body>"); out.println("<h2>上傳成功!</h2>"); out.println("</body></html>"); } }
總結
我覺得最關鍵的語句是 Part part = request.getPart("fileName"); 我把Part接口理解為文件本身,part.write(path + "\\" + fname);就理解為把part按照括號中的路徑寫進去,這里的路徑是包含文件名稱的,相當於一個盒子,part則是盒子中實際的文件內容。
獲得文件后綴的方法值得注意。