基于spring Mvc的文件上传下载

一个spring框架提供的文件上传下载,下面直接贴代码:

由于工作需要,我这里写的是图片上传,但是原理都是一样的,这里写的有上传下载和不怎么常用的删除。

由于文件名可能会重复,所以应该使用uuid把文件名重命名

下面是一个工具类:

public class FileLoadUtil{
    /**
     * 图片上传
     * @param request
     * @param file
     */
    public static String upload(HttpServletRequest request, MultipartFile file){

        //获取文件上传的路径
        String path = request.getServletContext().getRealPath("/images");
        //如果上传目录不存在,则创建出来
        File dir = new File(path);
        if(!dir.exists()){
            dir.mkdir();
        }
        //获取上传的文件名
        String fileName = file.getOriginalFilename();
        //重新定义文件名防止重名被替换
        String uuid = UUIDUtil.createUUID();
        fileName = uuid + fileName.substring(fileName.indexOf("."));
        //构建一个完整文件信息
        File fileMessage = new File(dir.getAbsolutePath() + "/" + fileName);
        try {
            //执行上传,调用transferTo方法
            file.transferTo(fileMessage);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("上传图片失败");
        }
        return fileName;
    }

    /**
     * 图片下载
     * @param fileName
     * @param request
     * @return
     */
    public static ResponseEntity<byte[]> downLoad(String fileName,HttpServletRequest request){
        //获取下载路径
        String path = request.getServletContext().getRealPath("/images");
        //构建下载文件
        File file = new File(path + "/" + fileName);
        //创建HttpHeaders设置响应头信息
        HttpHeaders headers = new HttpHeaders();
        try {
            //设置在响应头中的文件名称,这里进行重新编码,防止中文乱码
            String headerFileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
            //设置内容以附件的方式下载
            headers.setContentDispositionFormData("attachment", headerFileName);
            //设置相应类型为application/octet-stream
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            //创建ResponseEntity对象
            ResponseEntity<byte[]> entity = new ResponseEntity<>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
            return entity;
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("文件下载失败");
        }
    }

    /**
     * 删除图片
     * @param name
     * @param request
     * @return
     */

    public static String deletePhoto(String name,HttpServletRequest request){
        if(name ==null){
            return "没有图片可以删除";
        }else{
            //获取服务器路径+文件目录
            String path = request.getServletContext().getRealPath("/images");
            //构建完整的文件信息
            File file = new File(path + "/" + name);
            //判断文件是否存在,存在则删除
            if(file.exists()){
                //调用delete方法删除文件
                file.delete();
            }
            return "删除图片成功";
        }
    }
}

 

View Code

 工具类写好了我们来看一下控制层应该怎么写:

  因为前端不一定会选择图片上传,也就是说图片不是必选的是选填的,所以我们应该做一个文件是否为空的判断。

@RequestMapping("/save.json")
    @ResponseBody
    public JsonData saveUser(ExchangeParam param, HttpServletRequest request, @RequestParam("file") MultipartFile file) {
        if(!file.isEmpty()){
           String name = FileLoadUtil.upload(request,file);
           param.setPhotoName(name);
        }
        exchangeService.save(param);
        return JsonData.success();
    }
配置上传解析器,如果不进行配置默认则使用StandardServletMultipartResolver解析器, 它是基于Servlet3.0的上传方式 这里使用commons-fileupload上传,
因此使用CommonsMultipartResolver解析器
所以我们需要在pom.xml文件依赖jar包
<dependencies>
        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>

依赖完jar包之后,我们需要在dispatcher-servlet.xml配置一下

<mvc:default-servlet-handler/>

    <!-- 配置上传解析器,如果不进行配置默认则使用StandardServletMultipartResolver解析器,
         它是基于Servlet3.0的上传方式
         这里使用commons-fileupload上传,因此使用CommonsMultipartResolver解析器
         注意:bean的id必须是multipartResolver-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 限制上传大小(单位:字节) -->
        <property name="maxUploadSize" value="5242880"/>
        <!-- 指定默认编码-->
        <property name="defaultEncoding" value="utf-8"/>
    </bean>

好了,到了最后一步了,前端页面一个form表单就够了,应该注意的是怎么去把表单内容连同文件一起异步提交到后台

如果不需要异步请求直接通过表单提交的话只需要在form表单头部指定

  enctype="multipart/form-data"

如果是通过ajax或者axios的话需要用到一个FormData方法,因为这个方法是把整个表单对象格式,所以jquery可能会获取不到对象里面的内容,

所以我个人用的是最原始的方法:

 

    dcument.getElementById()

需要注意的是,使用FormData异步提交在ajax里面需要设置几个属性:

     cache: false,
    processData: false,
    contentType: false,

 

var form = document.getElementById("id");
        var formData = new FormData(form);
        $.ajax({
            url :url,
            type : 'POST',
            data : formData,
            cache: false,
            processData: false,
            contentType: false,
            success : function(result) {
               //提交成功后执行的方法
                
            }
        })

 

 

转载于:https://www.cnblogs.com/MyReM/p/9019064.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值