SpringBoot上传图片文件

12 篇文章 0 订阅
12 篇文章 1 订阅

首先准备好文件上传工具类:

package com.jpoa.common.utils.file;

import com.jpoa.common.config.Global;
import com.jpoa.common.exception.file.FileNameLengthLimitExceededException;
import com.jpoa.common.exception.file.FileSizeLimitExceededException;
import com.jpoa.common.utils.DateUtils;
import com.jpoa.common.utils.security.Md5Utils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.RandomUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;

/**
 * 文件上传工具类
 * 
 * @author jpoa
 */
public class FileUploadUtils
{
    /**
     * 默认大小 50M
     */
    public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024;

    /**
     * 默认的文件名最大长度 100
     */
    public static final int DEFAULT_FILE_NAME_LENGTH = 100;

    /**
     * 默认上传的地址
     */
    private static String defaultBaseDir = Global.getProfile();

    /**
     * 默认文件类型jpg
     */
    public static final String IMAGE_JPG_EXTENSION = ".jpg";

    private static int counter = 0;

    public static void setDefaultBaseDir(String defaultBaseDir)
    {
        FileUploadUtils.defaultBaseDir = defaultBaseDir;
    }

    public static String getDefaultBaseDir()
    {
        return defaultBaseDir;
    }

    /**
     * 以默认配置进行文件上传
     *
     * @param file 上传的文件
     * @return 文件名称
     * @throws Exception
     */
    public static final String upload(MultipartFile file) throws IOException
    {
        try
        {
            return upload(getDefaultBaseDir(), file, FileUploadUtils.IMAGE_JPG_EXTENSION);
        }
        catch (Exception e)
        {
            throw new IOException(e.getMessage(), e);
        }
    }

    /**
     * 根据文件路径上传
     *
     * @param baseDir 相对应用的基目录
     * @param file 上传的文件
     * @return 文件名称
     * @throws IOException
     */
    public static final String upload(String baseDir, MultipartFile file) throws IOException
    {
        try
        {
            return upload(baseDir, file, FileUploadUtils.IMAGE_JPG_EXTENSION);
        }
        catch (Exception e)
        {
            throw new IOException(e.getMessage(), e);
        }
    }

    /**
     * 根据文件格式上传
     *
     * @param file 上传的文件
     * @return 文件名称
     * @throws IOException
     */
    public static final String upload(MultipartFile file, String fileType) throws IOException
    {
        try
        {
            return upload(defaultBaseDir,file,fileType );
        }
        catch (Exception e)
        {
            throw new IOException(e.getMessage(), e);
        }
    }

    /**
     * 文件上传
     *
     * @param baseDir 相对应用的基目录
     * @param file 上传的文件
     * @param extension 上传文件类型
     * @return 返回上传成功的文件名
     * @throws FileSizeLimitExceededException 如果超出最大大小
     * @throws FileNameLengthLimitExceededException 文件名太长
     * @throws IOException 比如读写文件出错时
     */
    public static final String upload(String baseDir, MultipartFile file, String extension)
            throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException
    {

        int fileNamelength = file.getOriginalFilename().length();
        if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
        {
            throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
        }

        assertAllowed(file);

        String fileName = extractFilename(file, extension);

        File desc = getAbsoluteFile(baseDir, baseDir + fileName);
        file.transferTo(desc);
        return fileName;
    }

    public static final String extractFilename(MultipartFile file, String extension)
    {
        String filename = file.getOriginalFilename();
        //filename = DateUtils.datePath() + "/" + encodingFilename(filename) + extension;
        filename = DateUtils.datePath() + "/" + filename;
        return filename;
    }

    public static final File getAbsoluteFile(String uploadDir, String filename) throws IOException
    {
        File desc = new File(File.separator + filename);

        if (!desc.getParentFile().exists())
        {
            desc.getParentFile().mkdirs();
        }
        if (!desc.exists())
        {
            desc.createNewFile();
        }
        return desc;
    }

    public static final File getMkdirs(String filename) throws IOException
    {
        File desc = new File(File.separator + filename);

        if (!desc.exists())
        {
            desc.mkdir();
        }
        return desc;
    }

    /**
     * 编码文件名
     */
    private static final String encodingFilename(String filename)
    {
        filename = filename.replace("_", " ");
        filename = Md5Utils.hash(filename + System.nanoTime() + counter++);
        return filename;
    }

    /**
     * 文件大小校验
     *
     * @param file 上传的文件
     * @return
     * @throws FileSizeLimitExceededException 如果超出最大大小
     */
    public static final void assertAllowed(MultipartFile file) throws FileSizeLimitExceededException
    {
        long size = file.getSize();
        if (DEFAULT_MAX_SIZE != -1 && size > DEFAULT_MAX_SIZE)
        {
            throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024);
        }
    }

    /**
     * 上传图片路径
     * @param attach
     * @param session
     * @param request
     * @return 图片路径
     */
    public static final String uploadImg(MultipartFile attach, HttpSession session, HttpServletRequest request){
        String idPicPath=null;

            if(!attach.isEmpty()){
                //获取项目实际发布的上传路径并且加上你自己想创建的文件夹名File.separator是分割符
                String path=session.getServletContext().getRealPath("statics"+ File.separator+"uploadfiles");
                String oldFileName=attach.getOriginalFilename();//原文件名
                String prefix= FilenameUtils.getExtension(oldFileName);//源文件后缀
                int filesize=500000;
                if(attach.getSize()>filesize){//上传大小不得超过500kb
                    request.setAttribute("uploadFileError","* 上传大小不得超过500kb");
                    //返回添加页面
                }else if(prefix.equalsIgnoreCase("jpg")||prefix.equalsIgnoreCase("png")||
                        prefix.equalsIgnoreCase("jpeg")||prefix.equalsIgnoreCase("pneg")
                ){
                    String fileName= System.currentTimeMillis()+ RandomUtils.nextInt()+"_Personal.jpg";
                    File targetFile=new File(path,fileName);
                    if(!targetFile.exists()){
                        targetFile.mkdirs();
                    }
                    //保存
                    try {
                        //里面底层源码就是把文件复制到你想复制到的文件目录下
                        attach.transferTo(targetFile);
                    } catch (IOException e) {
                        e.printStackTrace();
                        request.setAttribute("uploadFileError","* 上传失败!");

                    }
                    //拼接图片路径
                    idPicPath="statics"+ File.separator+"uploadfiles"+File.separator+fileName;
                }else {
                    request.setAttribute("uploadFileError","* 上传图片格式不正确");

                }
            }
        return idPicPath;
    }
}

在页面中创建文件元素:

<form class="layui-form my-form-class" action="" enctype="multipart/form-data">
     <input type="hidden" name="errorinfo" id="errorinfo" value="${uploadFileError}">
     //在无上传图片的时候放一张图做提示
     <img  class="img" src="../images/nopictures.jpg" height="50" width="50">
     <input type="file" name="a_idPicPath" id="a_idPicPath"/>
     <font color="red"></font>
</form>

接下来在js里写上传图片显示的代码和传后台的代码:

$(function(){
        //上传图片后显示图片
        $("input[type='file']").change(function(){
            var file = this.files[0];
            if (window.FileReader) {
                var reader = new FileReader();
                reader.readAsDataURL(file);
                //监听文件读取结束后事件    
                reader.onloadend = function (e) {
                    $(".img").attr("src",e.target.result);    //e.target.result就是最后的路径地址
                };
            }
        });
    });

 function submitInfo(sendData) {
            $.ajax({
                url: "workflowBZGDAdd"
                , data: sendData
                , type: "POST"
                , contentType: false
                , async: false //同步请求
                , success: function (data) {
                    if (data == "true") {
                        parent.layer.msg("新增成功!", {icon: 1});
                        parent.$("#jqGrid").trigger("reloadGrid");
                    } else {
                        layer.msg(data, {icon: 5});
                    }
                }
            });
        }

       
        form.on('submit(sure)', function (data) {
            //表单序列化
            var data= $("form").serialize();
            submitInfo(data);
        });

后台控制器代码:


    @PostMapping("workflowBZGDAdd")
    @ResponseBody
    public String workflowBZGDAddPost(MwWorkitem mwWorkitem,HttpSession session, HttpServletRequest request,
                                      @RequestParam(value = "a_idPicPath",required = false) MultipartFile attach) {
        try {
            String img = FileUploadUtils.uploadImg(attach, session, request);
            if(StringUtils.isEmpty(img)){
                return img;
            }
            mwWorkitem.setImgicon(img);
            Integer insertMwWorkitem = mwWorkitemService.insertMwWorkitem(mwWorkitem);
            return "true";
        } catch (Exception e) {
            return e.getMessage();
        }
    }

 看看效果(上传文件前后):

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2Hhhhhh

一分也是爱 多多益善

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值