SpringMVC实现文件上传的范例【结合KindEditor】

本文介绍如何使用SpringMVC实现文件上传功能,特别结合了KindEditor编辑器,涵盖了判断文件类型、防止恶意文件、设定本地及网络保存路径、避免文件重名、创建多级目录以优化执行效率的策略。最后提供了页面JS交互和返回值格式的说明。
摘要由CSDN通过智能技术生成

实现的思路:

  • 判断是否为图片的类型(jpg|png|gif)
  • 判断是否为恶意的程序
  • 准备本地磁盘路径用来保存图片信息

       file:///C:/Users/LYJ/Pictures/Saved%20Pictures/%E6%89%8B%E6%9C%BA/5a0aa9abNde6ea381.jpg

  • 准备网络的请求路径(虚拟路径)

      https://img10.360buyimg.com/devfe/jfs/t7507/196/1481278321/1134/d2c81887/599d3334Nf16495a3.gif

  • 创建本地文件夹用来保存图片信息
  • 尽可能让图片不重名

         图片名称+时间毫秒

         图片名称+时间毫秒+3位随机数

  • 提高操作系统的执行效率

          会根据当前时间实现创建不同的文件夹一般按照yyyy/MM/dd/HH

  • 写盘操作

文件上传代码实现:

  • 页面JS
<td>
    <a href="javascript:void(0)" class="easyui-linkbutton picFileUpload">上传图片</a>
    <input type="hidden" name="image"/>
</td>



var TT = KindEditorUtil = { //相当于java中定义的工具类,里面提供了很多静态方法。

    // 编辑器参数

    kingEditorParams : {

    filePostName  : "uploadFile",  //文件上传的参数名称

    uploadJson : '/pic/upload',    //文件上传的路径

    dir : "image"

},
  • ​​​​​​​文件上传返回值格式

{"error":0,"url":"图片的保存路径","width":图片的宽度,"height":图片的高度}

参数说明: 0代表是一张图片,如果是0,前台才可以解析并显示。1代表不是图片,

不显示如果不设置宽度和高度,则默认用图片原来的大小,所以不用设置

​​​​​​​代码实现

@Service

public class FileUploadServiceImpl implements FileUploadService{

    private String dirPath = "E:/jt-upload/"; //定义本地磁盘路径

    private String url = "http://image.jt.com/";//定义url访问路径

    /**

     * 编程思路:

     * 1.获取图片的名称

     *  2.截取图片的类型
    
     *  3.判断是否为图片格式jpg|gif|png

     *  4.判断是否为恶意程序

     *  5.定义磁盘路径和url访问路径

     *  6.准备以时间为界限的文件夹

     *  7.让图片不重名 时间毫秒数+三位数据数

     *  8.创建文件夹

     *  9.开始写盘操作

     *  10.将数据准备好返回给客户端

     *  

     *  真实路径:

     *   E:/jt-upload/2018/1/17/12/123.jpg

     *  虚拟路径:

     *   http://image.jt.com/2018/1/17/12/123.jpg

     *  

     */

    @Override

    public PicUploadResult uploadFile(MultipartFile uploadFile) {

        PicUploadResult result = new PicUploadResult();

        //1.获取图片名称  aaa.jpg

        String fileName = uploadFile.getOriginalFilename();


        //2.获取图片的类型    -----.jpg

        String fileType =

        fileName.substring(fileName.lastIndexOf("."));


        //3.判断是否为图片格式  采用正则表达式

        if(!fileType.matches("^.*(jpg|png|gif)$")){

            //表示不是图片类型

            result.setError(1);

            return result; //如果程序出错 则直接返回对象

        }



    //4.判断是否为恶意程序

    /**

     * 判断一个文件是否为图片一般获取图片的高度和宽度

     * 如果二者都不为0则表示文件为图片

     */

    //4.1 通过工具类判断是否为图片

    try {

        BufferedImage bufferedImage =

        ImageIO.read(uploadFile.getInputStream());



        //4.2 获取图片的高度和宽度

        int width = bufferedImage.getWidth();

        int height = bufferedImage.getHeight();



        if(width ==0 || height == 0){

            result.setError(1); //表示非法程序

            return result;

        }



        //6.准备时间文件夹 并且时间格式 yyyy/MM/dd/HH

        String datePathDir =

        new SimpleDateFormat("yyyy/MM/dd/HH").format(new Date());



        //7.准备时间 时间毫秒数+三位随机数

        String millis = System.currentTimeMillis()+"";

        Random random = new Random();

        int randomNum = random.nextInt(999); //0-999的随机数

        String randomPath = millis+randomNum;



        //8.创建文件夹

        //E:/jt-upload/yyyy/MM/dd/HH

        String LocalPath = dirPath + datePathDir;

        File file = new File(LocalPath);



        if(!file.exists()){

        file.mkdirs(); //如果文件夹不存在 则创建文件夹

        }



        //8 通过工具类实现写盘操作

        //E:/jt-upload/yyyy/MM/dd/HH/232323111ll.jpg

        String LocalPathFile 

        = LocalPath + "/" + randomPath + fileName;

        //文件写盘 ccc/asdfasdfsfadfsss.jpg

        uploadFile.transferTo(new File(LocalPathFile));



        //10.准备数据返回给客户端

        result.setHeight(height+"");

        result.setWidth(width+"");

        //代表虚拟的全路径

        String urlPath = url + datePathDir+"/" + randomPath + fileName;

        result.setUrl(urlPath);

        return result;

        } catch (Exception e) {

        e.printStackTrace();

        }

            return null;

        }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值