文件上传合集

由于现在很多业务需要文件上传,而且前端上传的格式不同,有的是Base64格式,也可能是正常的图片格式,所以就把这些整理出来,方便以后用到。也方便大家。如果有什么不好之处,请大家麻烦给点意见。谢谢!!

基于maven 创建的文件上传。

所需要的 jar

commons-fileupload commons-fileupload 1.3.1

commons-httpclient commons-httpclient 3.1

net.coobird thumbnailator 0.4.8 //图片压缩所用

首先 方法要实现 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();//设置文件名

                    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("图片服务器服务繁忙");

            }

            return data;

}

设置随机的文件名 防止出现重名

/** * 随机 * * @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("图片服务器服务繁忙");

        } return data;

}

有时候咱们遇到用户上传的图片很大,那么我们就需要压缩图片并保留原图,代码如下

@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"); //构建保存文件路径

    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()) {

        //创建文件 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 与 图片之间的互相转换

1.图片转Base64

/** * @Description: 根据图片地址转换为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 转 图片

/** * @Description: 将base64编码字符串转换为图片 * @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);

        // 处理数据

        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;

    }

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容