上傳文件的方法就哪幾種,但總感覺麻煩一點也不精簡,就struts2的方法稍好一點。
下面的方法在之前寫的Servlet3.0方法之上進行再次精簡,應該是最易懂易用的,但是普通表單域是不能通過req.getParameter來獲得(因爲二進制流解析),來看看吧~
1.upload.jsp 文件上傳表單
<body>
<div class="form" align="center">
<form action="UploadServlet" enctype="multipart/form-data" method="post" >
select:<input type="file" name="file">
param:<input name="param"/><br/>
<input type="submit" value="submit">
</form>
</div>
</body>
2.UploadServlet.java 文件上
@WebServlet("/UploadServlet")
@MultipartConfig
public class UploadServlet extends HttpServlet{
private String filePath; //文件保存路徑
private static final long serialVersionUID = 3465909202303185511L;
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
super.init(config);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 對請求包設置編碼
req.setCharacterEncoding("utf-8");
// 告知tomcat如何編碼,瀏覽器如何解碼
resp.setContentType("text/html; charset=utf-8");
//獲得項目的根目錄,並設計文件保存路徑
filePath=getServletContext().getRealPath("/image");
// 爲了簡單,後面也直接就以fileName作爲保存文件的名稱
SimpleDateFormat dateFormat=new SimpleDateFormat("yyMMddHHmmss");
String fileName=dateFormat.format(new Date())+".jpg";
//獲取文件類型和大小
Part part = req.getPart("file");
System.out.println(part.getContentType());
System.out.println(part.getSize());
//獲得文本字段,下面方法不可行,只能解析英文和數字,中文即使編碼也不行。
String param=req.getParameter("param");
System.out.println("只能中文哦:"+param);
Collection<String> headerNames = part.getHeaderNames();
// 遍歷文件上傳域的Header Name
for (String headerName : headerNames) {
System.out.println(headerName + "---->" + part.getHeader(headerName));
}
// 將文件保存到項目下的uploads文件夾下,爲了簡單這裏沒寫判斷目錄是否存在及創建目錄的操作,要先確保該目錄已經存在
part.write(filePath + "/" + fileName);
System.out.println("文件保存在:"+filePath+fileName);
req.getRequestDispatcher("/index.jsp").forward(req, resp);
}
}