小兔Java教程 - 三分鍾學會Java文件上傳


1481256059691048096.jpg

今天群里正好有人問起了Java文件上傳的事情,本來這是Java里面的知識點,而我目前最主要的精力還是放在了JS的部分。不過反正也不麻煩,我就專門開一貼來聊聊Java文件上傳的基本實現方法吧。

話不多說,直接開始。

第一步,新建一個空白的web項目。開發工具我還是用的eclipse,我不喜歡用IDEAL。

1481256199097048746.png

接下來,編寫index.jsp

1481256242785087927.png

<%@ 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>Java文件上傳</title>
</head>
<body>
	
</body>
</html>

body里面就簡單弄一個上傳框了,上傳的服務器地址為service/upload.jsp,也就是WebContent目錄下,一個叫做service文件夾里面的upload.jsp。

JSP就是Servlet,也就是所謂的服務器程序。它既可以做表現層,也可以做服務層。

代碼:

<h1>文件上傳</h1>

<h1>文件上傳</h1>
<form action="service/upload.jsp" method="post" enctype="multipart/form-data">
	<input type="file" name="file">
	<input type="submit" value="文件上傳"> 
</form>

接下來,導入兩個jar包,分別是 **common-fileupload-1.2.jar **和 commons-io-2.0.1.jar

1481256577613028258.png

第二步,編寫文件上傳的服務類,也就是服務器端了。(我就直接寫JSP了,懶得寫Servlet)

先在WebContent目錄下增加一個service文件夾,再在里面新建一個upload.jsp。

1481256733535012389.png

為了看一下效果,我們再導入一個操作JSON的jar包。

1481257463144034558.png

然后,在JSP頁面導包:

<%@page import="org.apache.struts2.json.JSONUtil"%>
<%@page import="java.io.File"%>
<%@page import="org.apache.commons.fileupload.FileItem"%>
<%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>
<%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>
<%@page import="org.apache.commons.fileupload.FileItemFactory"%>
<%@page import="java.text.DecimalFormat"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

接下來,要在JSP頁面寫Java代碼,先弄一對尖括號,Java代碼就寫在里面:

<%

 
%>

01、獲取文件上傳的真實路徑(就是你要把文件保存在項目的什么地方?)

//獲取文件的上傳的具體目錄,就是你的web項目的真實路徑
String realPath = request.getSession().getServletContext().getRealPath("/");
//定義上傳的目錄
String dirPath = realPath+"/upload";
File dirFile = new File(dirPath);

02、如果該路徑不存在就自動創建

//自動創建上傳的目錄
if(!dirFile.exists())dirFile.mkdirs();

我們把上傳的文件放在WebContent目錄下,也就是項目根路徑下的一個叫做upload的文件夾內,如果沒有,就自動創建一個。

03、進行上傳操作,文件名用UUID

//上傳操作  
FileItemFactory factory = new DiskFileItemFactory();  
ServletFileUpload upload = new ServletFileUpload(factory);  
String fileName = null;
HashMap<String,Object> map = new HashMap<String,Object>();
	try{  
     List items = upload.parseRequest(request);
  if(null != items){  
         Iterator itr = items.iterator();  
         while(itr.hasNext()){  
             FileItem item = (FileItem)itr.next();  
             if(item.isFormField()){  
                 continue;  
             }else{  
                fileName = UUID.randomUUID().toString()+getExt(item.getName());
		        //上傳文件的目錄
                File savedFile = new File(dirPath,fileName);  
                item.write(savedFile);  
                map.put("name",item.getName());//文件的重視名稱
                map.put("size",item.getSize());//文件的真實大小
                map.put("sizeString",countFileSize(item.getSize()));//獲取文件轉換以后的大寫
                map.put("url","upload/"+fileName);//獲取文件的具體服務器的目錄
             }  
         }  
  }  
}catch(Exception e){  
     e.printStackTrace();  
}

最后,在新的頁面打印文件的具體信息:

out.print(JSONUtil.serialize(map));

輔助函數:

<%!
/**
 * 文件大小轉換成格式化的字符串
 */
public static String countFileSize(long fileSize) {
	String fileSizeString = "";
	try {
		DecimalFormat df = new DecimalFormat("#.00");
		long fileS = fileSize;
		if (fileS == 0) {
			fileSizeString = "0KB";
		} else if (fileS < 1024) {
			fileSizeString = df.format((double) fileS) + "B";
		} else if (fileS < 1048576) {
			fileSizeString = df.format((double) fileS / 1024) + "KB";
		} else if (fileS < 1073741824) {
			fileSizeString = df
					.format(((double) fileS / 1024 / 1024) - 0.01)
					+ "MB";
		} else {
			fileSizeString = df.format((double) fileS / 1024 / 1024 / 1024)
					+ "G";
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
	return fileSizeString;
}


/**
 * 獲取一個文件的后綴(帶有點)
 * 
 * @param fileName
 *            文件名
 * @return 返回文件的后綴
 */
public static String getExt(String fileName) {
	int pos = fileName.lastIndexOf(".");
	if (pos == -1)
		return "";
	return fileName.substring(pos, fileName.length());
}

/**
 * 獲取一個文件的后綴(不帶有點)
 * 
 * @param fileName
 *            文件名
 * @return 返回文件的后綴
 */
public static String getExtNoPoint(String fileName) {
	if (fileName.lastIndexOf(".") == -1)
		return "";
	int pos = fileName.lastIndexOf(".") + 1;
	return fileName.substring(pos, fileName.length());
}
%>

OK,現在啟動tomcat服務器。

1481257995441086413.png

沒報錯。

1481258009207016477.png

因為在web.xml里面配置了歡迎頁,所以直接訪問。

http://localhost/upload

1481258089816075458.png

隨便上傳一張圖片,點擊文件上傳,

1481258548269004945.png

報錯了,看樣子還是缺少jar包。

缺了xwork-core-2.3.15.1.jar 這個包,貌似這兩包

1481258696566000776.png

是有依賴關系的,其實,這里只是為了把文件信息轉成JSON格式,如果你有其他好用的jar包的話,也可以,不一定非要用這兩個jar包。

導進去,重啟tomcat,上傳文件,就OK了。

打印出來的信息:

{"name":"1929342-c2daab1a3c58006d.jpg","sizeString":"564.08KB","url":"upload/b4a08821-3d1a-41e6-b6e4-7985487513b0.jpg","size":577614}

再去發布目錄看看

果然,它創建了一個upload文件夾:

1481258814488031118.png

圖片也成功上傳了~

1481258843926058617.png

好的,本文就介紹到這里,至於圖片的真實路徑,一般來說你要保存到數據庫里面的。我個人不建議通過IO流的方式直接把圖片保存到數據庫,如果項目很大,你的數據庫動輒幾百個G,有點吃不消的。還是把圖片放在硬盤上吧,如果要分布式,再另想辦法,比如那個ngx啥的。

源碼地址:http://pan.baidu.com/s/1b7E1oa
個人博客:http://www.xiaotublog.com/index.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM