文件上傳合集

由于現(xiàn)在很多業(yè)務(wù)需要文件上傳,而且前端上傳的格式不同,有的是Base64格式,也可能是正常的圖片格式,所以就把這些整理出來,方便以后用到。也方便大家。如果有什么不好之處,請大家麻煩給點(diǎn)意見。謝謝!!

基于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 類 重寫?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);//獲取絕對路徑

? ? ? ? ? ? ? ? ? ? ?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("開始上傳圖片");

????????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í)候咱們遇到用戶上傳的圖片很大,那么我們就需要壓縮圖片并保留原圖,代碼如下

@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;

????}

????//拼接后臺文件名稱

????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);

????????//寫出文件

????????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*/

????//拼接后臺文件名稱

? ? 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)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,034評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,327評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,337評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,883評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,114評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,625評論 1 332
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,555評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,737評論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,973評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,343評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,699評論 2 370

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