文件上傳合集

由于現(xiàn)在很多業(yè)務(wù)需要文件上傳僵缺,而且前端上傳的格式不同,有的是Base64格式踩叭,也可能是正常的圖片格式磕潮,所以就把這些整理出來(lái),方便以后用到容贝。也方便大家自脯。如果有什么不好之處,請(qǐng)大家麻煩給點(diǎn)意見(jiàn)斤富。謝謝8喑薄!

基于maven 創(chuàng)建的文件上傳满力。

所需要的 jar

commons-fileupload commons-fileupload 1.3.1

commons-httpclient commons-httpclient 3.1

net.coobird thumbnailator 0.4.8 //圖片壓縮所用

首先 方法要實(shí)現(xiàn)?ServletContextAware 類(lèi) 重寫(xiě)?ServletContext

public class FileController implements ServletContextAware{

????????private ServletContext servletContext;

????????@Override

????????public void setServletContext(ServletContext servletContext) {

????????????this.servletContext = servletContext;

????????}

}

下面是上傳正常圖片格式的代碼

@RequestMapping(value="fileUploadImg",method=RequestMethod.POST)

@ResponseBody

public JsonData fileUpload( @RequestParam("file") CommonsMultipartFile file){

????JsonData data = new JsonData();

????data.setResult(0);

????try {

? ?????????????????? //文件上傳保存的路徑

??????????????????String realPaths = Config.UPLOAD_BASE_DIR+"/"+DateUtil.stampToDate(System.currentTimeMillis(), "yyyy/MM/dd");

? ? ? ? ? ? ? ? ? ? String abspath = servletContext.getRealPath(realPath);//獲取絕對(duì)路徑

? ? ? ? ? ? ? ? ? ? ?File uploadDir = new File(abspath);

????????????????????if (!uploadDir.exists()) {

????????????????????????????uploadDir.mkdirs();

????????????????????}

????????????????????String fileName = randName() + file.getOriginalFilename();//設(shè)置文件名

????????????????????File tagelFile = new File(abspath, fileName);

????????????????????file.transferTo(tagelFile);

????????????????????System.out.println(tagelFile.getPath());

????????????????????data.setData(fileName); data.setResult(1);

????????????} catch (Exception e) {

????????????????e.printStackTrace();

????????????????data.setErrMsg("圖片服務(wù)器服務(wù)繁忙");

????????????}

????????????return data;

}

設(shè)置隨機(jī)的文件名 防止出現(xiàn)重名

/** * 隨機(jī) * * @return */

@SuppressWarnings("static-access")

private static String randName() {

????Calendar calendar = Calendar.getInstance();

????StringBuffer sb = new StringBuffer();

????sb.append(calendar.get(calendar.YEAR));

????sb.append(calendar.get(calendar.MONTH) + 1);

????sb.append(calendar.get(calendar.DATE));

????sb.append(calendar.get(calendar.HOUR));

????sb.append(calendar.get(calendar.MINUTE));

????sb.append(calendar.get(calendar.SECOND));

????Random random = new Random();

????Integer n = random.nextInt(999999);

????sb.append(n.toString());

????return sb.toString();

}

前端上傳的圖片格式為base64的上傳代碼如下

@RequestMapping(value="base64File",method=RequestMethod.POST)

@ResponseBody

public JsonData base64File(@RequestBody String file){

????????MyLogUtils.getInstance().log("開(kāi)始上傳圖片");

????????JsonData data = new JsonData();

????????data.setResult(1);

????????try {

????????????????file=file.replaceAll("\"", "");

????????????????String realPath = Config.UPLOAD_BASE_DIR+DateUtil.stampToDate(System.currentTimeMillis(), "yyyy/MM/dd");

????????????????String abspath = servletContext.getRealPath(realPath);

????????????????File uploadDir = new File(abspath);

????????????????if (!uploadDir.exists()) {

????????????????????????uploadDir.mkdirs();

? ? ? ? ? ? ? ? ? }

????????????????String fileName = randName()+".jpg";

????????????????Base64File.generateImage(file, abspath+"/"+fileName);

????????????????data.setData(fileName);

????????????????data.setResult(0);

????????????????MyLogUtils.getInstance().log("上傳圖片成功");

????????????} catch (Exception e) {

????????????????e.printStackTrace();

????????????????data.setErrMsg("圖片服務(wù)器服務(wù)繁忙");

????????} return data;

}

有時(shí)候咱們遇到用戶(hù)上傳的圖片很大焕参,那么我們就需要壓縮圖片并保留原圖,代碼如下

@RequestMapping(value="imgFileCompress",method=RequestMethod.POST)

@ResponseBody

public Json<Data> uploadFileAndCreateThumbnail(@RequestParam("file") CommonsMultipartFile imageFile) {

????Json<Data> data = new Json<Data>();

????data.setResult(0);

????if(imageFile == null ){

????????data.setErrMsg("imageFile不能為空");

????????return data;

????}

????if (imageFile.getSize() >= 10*1024*1024){

????????data.setErrMsg("文件不能大于10M");

????????return data;

????}

????//拼接后臺(tái)文件名稱(chēng)

????String pathName = randName() + "." + FilenameUtils.getExtension(imageFile.getOriginalFilename()); //文件存放路徑

????String realPaths = Config.UPLOAD_BASE_DIR+"/"+DateUtil.stampToDate(System.currentTimeMillis(), "yyyy/MM/dd"); //構(gòu)建保存文件路徑

????String realPath = servletContext.getRealPath(realPaths); //拼接文件路徑

????String filePathName = realPath + File.separator + pathName; System.out.println("圖片上傳路徑:"+filePathName);

????//判斷文件保存是否存在

????File file = new File(filePathName);

????if (file.getParentFile() != null || !file.getParentFile().isDirectory()) {

????????//創(chuàng)建文件 file.getParentFile().mkdirs();

????}

????InputStream inputStream = null;

????FileOutputStream fileOutputStream = null;

????try {

????????inputStream = imageFile.getInputStream();

????????fileOutputStream = new FileOutputStream(file);

????????//寫(xiě)出文件

????????byte[] buffer = new byte[2048];

????????IOUtils.copyLarge(inputStream, fileOutputStream, buffer);

????????buffer = null;

????} catch (IOException e) {

????????filePathName = null;

????????data.setErrMsg("操作失敗");

????????e.printStackTrace();

????????return data;

????} finally {

????????try {

????????????if (inputStream != null) {

????????????????inputStream.close();

????????????}

????????????if (fileOutputStream != null) {

????????????????fileOutputStream.flush();

????????????????fileOutputStream.close();

????????????}

????????} catch (IOException e) {

????????????filePathName = null;

????????????data.setErrMsg("操作失敗");

????????????return data;

????????}

????}

????/*** 縮略圖begin*/

????//拼接后臺(tái)文件名稱(chēng)

? ? String thumbnailPathName = randName() + "small." + FilenameUtils.getExtension(imageFile.getOriginalFilename()); ????if(thumbnailPathName.contains(".png")){

????????????thumbnailPathName = thumbnailPathName.replace(".png", ".jpg");

????}

????long size = imageFile.getSize();

????double scale = 1.0d ;

????if(size >= 200*1024){

????????if(size > 0){

????????????scale = (200*1024f) / size ;

????????}

????}

? ? //拼接文件路徑

? ? String thumbnailFilePathName = realPath + File.separator + thumbnailPathName;

????try {

????????if(size < 200*1024){

????????????Thumbnails.of(filePathName).scale(1f).outputFormat("jpg").toFile(thumbnailFilePathName);

????????}else{

????????????Thumbnails.of(filePathName).scale(1f).outputQuality(scale).outputFormat("jpg").toFile(thumbnailFilePathName);

????????}

????} catch (Exception e1) {

????????data.setErrMsg("操作失敗");

????????return data;

????}

????/*** 縮略圖end*/

????Map map = new HashMap();

????//原圖地址

????map.put("originalUrl", pathName);

????//縮略圖地址

????map.put("thumbnailUrl", thumbnailPathName);

????data.setData(map);

????data.setResult(1);

????return data;

}

附加:base64 與 圖片之間的互相轉(zhuǎn)換

1.圖片轉(zhuǎn)Base64

/** * @Description: 根據(jù)圖片地址轉(zhuǎn)換為base64編碼字符串

????* @Author: * @CreateTime: * @return */

public static String getImageStr(String imgFile) {

? ? InputStream inputStream = null;

????byte[] data = null;

try {

????inputStream = new FileInputStream(imgFile);

????data = new byte[inputStream.available()];

????inputStream.read(data);

????inputStream.close();

????} catch (IOException e) {

????e.printStackTrace();

????}

????// 加密

????BASE64Encoder encoder = new BASE64Encoder();

????return encoder.encode(data);

}

2.base64 轉(zhuǎn) 圖片

/** * @Description: 將base64編碼字符串轉(zhuǎn)換為圖片 * @Author: * @CreateTime:

* @param imgStr base64編碼字符串 * @param path 圖片路徑-具體到文件 * @return */

public static boolean generateImage(String imgStr, String path) {

????if (imgStr == null){

????return false;

????}

????BASE64Decoder decoder = new BASE64Decoder();

try {

????// 解密

????byte[] b = decoder.decodeBuffer(imgStr);

????????// 處理數(shù)據(jù)

????????for (int i = 0; i < b.length; ++i) {

????????????if (b[i] < 0) { b[i] += 256;

????????}

????}

????OutputStream out = new FileOutputStream(path);

????out.write(b);

????out.flush();

????out.close();

????return true;

????}catch(Exception ex){

????return false;

????}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末油额,一起剝皮案震驚了整個(gè)濱河市叠纷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌潦嘶,老刑警劉巖涩嚣,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異掂僵,居然都是意外死亡航厚,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)锰蓬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)幔睬,“玉大人,你說(shuō)我怎么就攤上這事互妓∠希” “怎么了坤塞?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)澈蚌。 經(jīng)常有香客問(wèn)我摹芙,道長(zhǎng),這世上最難降的妖魔是什么宛瞄? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任浮禾,我火速辦了婚禮,結(jié)果婚禮上份汗,老公的妹妹穿的比我還像新娘盈电。我一直安慰自己,他們只是感情好杯活,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布匆帚。 她就那樣靜靜地躺著,像睡著了一般旁钧。 火紅的嫁衣襯著肌膚如雪吸重。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,590評(píng)論 1 305
  • 那天歪今,我揣著相機(jī)與錄音嚎幸,去河邊找鬼。 笑死寄猩,一個(gè)胖子當(dāng)著我的面吹牛嫉晶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播田篇,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼替废,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了斯辰?” 一聲冷哼從身側(cè)響起舶担,我...
    開(kāi)封第一講書(shū)人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎彬呻,沒(méi)想到半個(gè)月后衣陶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闸氮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年剪况,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒲跨。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡译断,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出或悲,到底是詐尸還是另有隱情孙咪,我是刑警寧澤堪唐,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站翎蹈,受9級(jí)特大地震影響淮菠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜荤堪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一合陵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧澄阳,春花似錦拥知、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至揩抡,卻和暖如春户侥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背峦嗤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屋摔,地道東北人烁设。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像钓试,于是被迫代替她去往敵國(guó)和親装黑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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