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

Paste_Image.png

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

話不多說熏版,直接開始纷责。

第一步,新建一個空白的web項目撼短。開發(fā)工具我還是用的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里面就簡單弄一個上傳框了饵史,上傳的服務(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泥兰。

1481256577613028258.png

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

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

1481256733535012389.png

為了看一下效果削彬,我們再導(dǎo)入一個操作JSON的jar包。

1481257463144034558.png

然后秀仲,在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ù)器。

1481257995441086413.png

沒報錯遍蟋。

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

http://localhost/upload

1481258089816075458.png

隨便上傳一張圖片虚青,點擊文件上傳它呀,

1481258548269004945.png

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

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

1481258696566000776.png

是有依賴關(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文件夾:

1481258814488031118.png

圖片也成功上傳了~

1481258843926058617.png

好的指孤,本文就介紹到這里启涯,至于圖片的真實路徑,一般來說你要保存到數(shù)據(jù)庫里面的邓厕。我個人不建議通過IO流的方式直接把圖片保存到數(shù)據(jù)庫逝嚎,如果項目很大,你的數(shù)據(jù)庫動輒幾百個G详恼,有點吃不消的补君。還是把圖片放在硬盤上吧,如果要分布式昧互,再另想辦法挽铁,比如那個ngx啥的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末敞掘,一起剝皮案震驚了整個濱河市叽掘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌玖雁,老刑警劉巖更扁,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赫冬,居然都是意外死亡浓镜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門劲厌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膛薛,“玉大人,你說我怎么就攤上這事补鼻『遄模” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵风范,是天一觀的道長咨跌。 經(jīng)常有香客問我,道長硼婿,這世上最難降的妖魔是什么虑润? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮加酵,結(jié)果婚禮上拳喻,老公的妹妹穿的比我還像新娘哭当。我一直安慰自己,他們只是感情好冗澈,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布钦勘。 她就那樣靜靜地躺著,像睡著了一般亚亲。 火紅的嫁衣襯著肌膚如雪彻采。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天捌归,我揣著相機與錄音肛响,去河邊找鬼。 笑死惜索,一個胖子當著我的面吹牛特笋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播巾兆,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼猎物,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了角塑?” 一聲冷哼從身側(cè)響起蔫磨,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎圃伶,沒想到半個月后堤如,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡窒朋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年搀罢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茎芭。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡意蛀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情菌赖,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布肋乍,位于F島的核電站绳慎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏彩匕。R本人自食惡果不足惜腔剂,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望驼仪。 院中可真熱鬧掸犬,春花似錦袜漩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至介褥,卻和暖如春座掘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柔滔。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工溢陪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人睛廊。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓形真,卻偏偏與公主長得像,于是被迫代替她去往敵國和親喉前。 傳聞我的和親對象是個殘疾皇子没酣,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 本文包括:1、文件上傳概述2卵迂、利用 Commons-fileupload 組件實現(xiàn)文件上傳3裕便、核心API——Dis...
    廖少少閱讀 12,517評論 5 91
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)见咒,斷路器偿衰,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 這部分主要是與Java Web和Web Service相關(guān)的面試題。 96改览、闡述Servlet和CGI的區(qū)別? 答...
    雜貨鋪老板閱讀 1,397評論 0 10
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法下翎,類相關(guān)的語法,內(nèi)部類的語法宝当,繼承相關(guān)的語法视事,異常的語法,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • 文/沐瀅 01 這一天早上庆揩,楊遠接到了一個好哥們王迅的電話俐东,"楊遠,今天文文要結(jié)婚了订晌,之前她讓我轉(zhuǎn)告你虏辫,我本來不想...
    沐瀅閱讀 495評論 4 7