今天群里正好有人問起了Java文件上傳的事情刘陶,本來這是Java里面的知識點,而我目前最主要的精力還是放在了JS的部分牢撼。不過反正也不麻煩匙隔,我就專門開一貼來聊聊Java文件上傳的基本實現(xiàn)方法吧。
話不多說熏版,直接開始纷责。
第一步,新建一個空白的web項目撼短。開發(fā)工具我還是用的eclipse再膳,我不喜歡用IDEAL。
接下來曲横,編寫index.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>Java文件上傳</title>
</head>
<body>
</body>
</html>
body里面就簡單弄一個上傳框了饵史,上傳的服務(wù)器地址為service/upload.jsp,也就是WebContent目錄下胜榔,一個叫做service文件夾里面的upload.jsp胳喷。
JSP就是Servlet,也就是所謂的服務(wù)器程序夭织。它既可以做表現(xiàn)層吭露,也可以做服務(wù)層。
代碼:
<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>
接下來尊惰,導(dǎo)入兩個jar包讲竿,分別是 **common-fileupload-1.2.jar **和 commons-io-2.0.1.jar泥兰。
第二步,編寫文件上傳的服務(wù)類题禀,也就是服務(wù)器端了鞋诗。(我就直接寫JSP了,懶得寫Servlet)
先在WebContent目錄下增加一個service文件夾,再在里面新建一個upload.jsp迈嘹。
為了看一下效果削彬,我們再導(dǎo)入一個操作JSON的jar包。
然后秀仲,在JSP頁面導(dǎo)包:
<%@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沛励、如果該路徑不存在就自動創(chuàng)建
//自動創(chuàng)建上傳的目錄
if(!dirFile.exists())dirFile.mkdirs();
我們把上傳的文件放在WebContent目錄下,也就是項目根路徑下的一個叫做upload的文件夾內(nèi)炮障,如果沒有目派,就自動創(chuàng)建一個。
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()));//獲取文件轉(zhuǎn)換以后的大寫
map.put("url","upload/"+fileName);//獲取文件的具體服務(wù)器的目錄
}
}
}
}catch(Exception e){
e.printStackTrace();
}
最后铐拐,在新的頁面打印文件的具體信息:
out.print(JSONUtil.serialize(map));
輔助函數(shù):
<%!
/**
* 文件大小轉(zhuǎn)換成格式化的字符串
*/
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徘键,現(xiàn)在啟動tomcat服務(wù)器。
沒報錯遍蟋。
因為在web.xml里面配置了歡迎頁吹害,所以直接訪問。
隨便上傳一張圖片虚青,點擊文件上傳它呀,
報錯了,看樣子還是缺少jar包棒厘。
缺了xwork-core-2.3.15.1.jar 這個包纵穿,貌似這兩包
是有依賴關(guān)系的,其實奢人,這里只是為了把文件信息轉(zhuǎn)成JSON格式谓媒,如果你有其他好用的jar包的話,也可以何乎,不一定非要用這兩個jar包句惯。
導(dǎo)進去土辩,重啟tomcat,上傳文件抢野,就OK了拷淘。
打印出來的信息:
{"name":"1929342-c2daab1a3c58006d.jpg","sizeString":"564.08KB","url":"upload/b4a08821-3d1a-41e6-b6e4-7985487513b0.jpg","size":577614}
再去發(fā)布目錄看看
果然,它創(chuàng)建了一個upload文件夾:
圖片也成功上傳了~
好的指孤,本文就介紹到這里启涯,至于圖片的真實路徑,一般來說你要保存到數(shù)據(jù)庫里面的邓厕。我個人不建議通過IO流的方式直接把圖片保存到數(shù)據(jù)庫逝嚎,如果項目很大,你的數(shù)據(jù)庫動輒幾百個G详恼,有點吃不消的补君。還是把圖片放在硬盤上吧,如果要分布式昧互,再另想辦法挽铁,比如那個ngx啥的。