eclipse用法之java中文件的上傳操作
一、單文件上傳:
1.首先前端頁面的編寫只有一個註意項:就是上傳的文件中有圖片時更改表單項的entype屬性為:enctype="multipart/form-data"
簡單說明一下:表單中enctype="multipart/form-data"的意思,是設置表單的MIME編碼。默認情況,這個編碼格式是application/x-www-form-urlencoded,不能用於文件 上傳; 只有使用了multipart/form-data,才能完整的傳遞文件數據,進行下面的操作.
想知道具體為什麽的可以百度一下
下面是筆者寫的前端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>Insert title here</title> </head> <body> <form action="${pageContext.request.contextPath}/BServlet" method="post" enctype="multipart/form-data"> 昵稱:<input type="text" name="Name"><br /> <input type="file" name="File"> <br /> <input type="submit" value="上傳"> </form> </body> </html>
2.servlet的編寫:
2.1首先是導包:
> 我們一般情況下使用commons-fileupload-1.3.1.jar這個工具來解析多部件請求。
> fileupload 依賴 commons-io 所以我們要是Filtupload需要同時導入io包。
所以我們需要導入的兩個包筆者已經上傳到百度雲了,需要的朋友可以在這下載(鏈接:http://pan.baidu.com/s/1c17Ohqw 密碼:v3g8)
2.2接下來編寫servlet:
先來做一些簡單的說明:
DiskFileItemFactory - 工廠類,用於構建一個解析器實例。
ServletFileUpload - 解析器類,通過該類實例來解析request中的請求信息。
FileItem - 工具會將我們請求中每一個部件,都封裝為一個FileItem對象,處理文件上傳時,只需要調用該對象的方法
- 方法:
boolean isFormField() --> 當前表單項是否是一個普通表單項,true是普通表單項, false是文件表單項
String getContentType() --> 返回的是文件的類型,是MIME值
String getFieldName() --> 獲取表單項的name屬性值
String getName() --> 獲取上傳的文件的名字
long getSize() --> 獲取文件的大小
String getString(String encoding) --> 獲取表單項的value屬性值,需要接受一個編碼作為參數。
void write(File file) --> 將表單項中的內容寫入到磁盤中
(這是我們經常需要用到的一些方法)
> 使用步驟:
1.獲取工廠類實例[DiskFileItemFactory]
2.獲取解析器類實例[ServletFileUpload]
3.解析request獲取FileItem[parseRequest()]
下面是筆者寫的一段簡短的servlet代碼(將上傳的文件保存到電腦),希望對大家有寫幫助:
protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { // 用於測試前端頁面是否與servlet連接好 System.out.println("連接沒問題"); // 工廠類 DiskFileItemFactory dfif = new DiskFileItemFactory(); // 用於文件上傳 ServletFileUpload fileupload = new ServletFileUpload(dfif); // 設置文件大小(單個文件大小限制100k) fileupload.setFileSizeMax(1034 * 100); try { // 獲取前端上傳的文件 List<FileItem> fileList = fileupload.parseRequest(request); for (FileItem item : fileList) { if (item.isFormField()) { // 普通表單項(也就是jsp頁面中name="Name"中的內容) String name = item.getFieldName(); String value = item.getString("utf-8"); System.out.println(name + ":" + value); } else { // 文件表單項 long size = item.getSize(); //文件的下載位置C:/Users/TYD/Desktop/123.jpg並命名為123.jpg String path = "C:/Users/TYD/Desktop/123.jpg"; File f = new File(path); try { item.write(f); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
try和catch是拋出異常
下面這段代碼是將上傳的文件保存服務器:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("連接沒問題"); //工廠類 DiskFileItemFactory dfif=new DiskFileItemFactory(); //用於文件上傳 ServletFileUpload fileupload=new ServletFileUpload(dfif); //設置文件大小(單個文件大小限制50k) fileupload.setFileSizeMax(1034*50); //設置服務器地址 ServletContext servletContext = request.getServletContext(); //在服務器創建一個upload文件 String realPath = servletContext.getRealPath("/upload"); System.out.println("realPath"+realPath); File file = new File(realPath); //判斷文件是否為空 if(!file.exists()){ //如果文件不存在,創建文件 file.mkdir(); } try { //獲取前端上傳的文件 List<FileItem> fileList=fileupload.parseRequest(request); for(FileItem item:fileList){ if(item.isFormField()){ //普通表單項 String name=item.getFieldName(); String value=item.getString("utf-8"); System.out.println(name+":"+value); }else{ //文件表單項 long size=item.getSize();//獲取文件格式 //防止上傳空文件 if(size ==0){ continue; } System.out.println("size:"+size); //設置新創建的文件的名字 String contentType = item.getContentType(); String name = item.getName(); if(name.contains("\\")){ name = name.substring(name.lastIndexOf("\\")+1); } System.out.println("name:"+name); //防止同名文件覆蓋 String prefix = UUID.randomUUID().toString(); //去除文件中的- prefix = prefix.replace("-",""); String fileName = prefix+"_"+name; String fieldName = item.getFieldName(); System.out.println(size+":"+contentType+":--------"+name+":"+fieldName); try { item.write(new File(realPath+"\\"+fileName)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }catch(FileSizeLimitExceededException e){ System.out.println("文件大小不可以超過50K"); } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
接下來便是上傳多個文件到服務器
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("連接沒問題"); //工廠類 DiskFileItemFactory dfif=new DiskFileItemFactory(); //用於文件上傳 ServletFileUpload fileupload=new ServletFileUpload(dfif); //設置多個文件總大小 fileupload.setSizeMax(1024*200); //設置服務器地址 ServletContext servletContext = request.getServletContext(); //在服務器創建一個upload文件 String realPath = servletContext.getRealPath("/upload"); System.out.println("realPath"+realPath); File file = new File(realPath); //判斷文件是否為空 if(!file.exists()){ //如果文件不存在,創建文件 file.mkdir(); } try { //獲取前端上傳的文件 List<FileItem> fileList=fileupload.parseRequest(request); for(FileItem item:fileList){ if(item.isFormField()){ //普通表單項 String name=item.getFieldName(); String value=item.getString("utf-8"); System.out.println(name+":"+value); }else{ //文件表單項 long size=item.getSize();//獲取文件格式 //防止上傳空文件 if(size ==0){ continue; } System.out.println("size:"+size); //設置新創建的文件的名字 String contentType = item.getContentType(); String name = item.getName(); if(name.contains("\\")){ name = name.substring(name.lastIndexOf("\\")+1); } System.out.println("name:"+name); //防止同名文件覆蓋 String prefix = UUID.randomUUID().toString(); prefix = prefix.replace("-",""); String fileName = prefix+"_"+name; String fieldName = item.getFieldName(); System.out.println(size+":"+contentType+":--------"+name+":"+fieldName); try { item.write(new File(realPath+"\\"+fileName)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }catch(SizeLimitExceededException e){ System.out.println("總大小不可以超過150k"); } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
好了,關於文件的上傳就到這裏。希望對大家有些幫助。。。
eclipse用法之java中文件的上傳操作