统计
  • 建站日期:2019-12-01
  • 文章总数:1668 篇
  • 评论总数:1802 条
  • 分类总数:20 个
  • 最后更新:4月23日
文章 未分类

springmvc实现文件上传下载

程序员阿鑫
首页 未分类 正文
官方推荐

需求:再web项目中,可能会出现需要上传文件,如用户注册上传头像,上传照片,或其他资源等

springmvc实现文件上传:

1.导入jar包:


springmvc实现文件上传下载
-程序员阿鑫-带你一起秃头
-第1
张图片

2设置表单:

<!--当表单中存在文件上传时,需要再form表单中添加enctype="multipart/form-data"属性,而且提交方式必须为post请求,不然上传图片等会报错-->
<form action="../file" method="post" enctype="multipart/form-data">
    <input type="file" name="img">
    <input type="submit">
</form>

3.设置文件上传视图解析器:

<!--配置文件上传视图解析器-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--设置编码格式-->
        <property name="defaultEncoding" value="utf-8"/>
        <!--设置文件最大的大小10M-->
        <property name="maxInMemorySize" value="#{10*1024*1024}"/>
    </bean>

4.上传功能后台:

@Controller
public class FileController {

    /*@RequestParam("img) 将前端请求中指定name的数据放入参数中*/
    @RequestMapping("/file")
    public String file(@RequestParam("img") MultipartFile file, HttpServletRequest request) {
//        获取原始文件名
        String trueName = file.getOriginalFilename();
//        设置文件保存的路径:当前项目的下的/static/upload/文件夹下;因为运行时是编译后的文件再tomcat服务器中运行,
//        因此查看是否上传成功需要再class文件中查看
        String path = request.getSession().getServletContext().getRealPath("/static/upload/");
//        设置上传文件保存本地的文件名及路径
        File file1 = new File(path + trueName);
//        判断当前文件父级文件夹是否存在,如果不存在,就创建文件夹
        if (!file1.getParentFile().exists()) {
            file1.mkdirs();
        }
        try {
//            上传文件,核心功能
            file.transferTo(file1);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "index";
    }
}

一个最简单的上传功能就完成了,不过这种方式并不好,因为如果有多人操作,出现上传文件名相同等问题,会覆盖,因此要生成一个不会重复的文件名:

1.使用时间来设置文件名:


springmvc实现文件上传下载
-程序员阿鑫-带你一起秃头
-第2
张图片

上传后保存路径:


springmvc实现文件上传下载
-程序员阿鑫-带你一起秃头
-第3
张图片

2.使用UUID类:


springmvc实现文件上传下载
-程序员阿鑫-带你一起秃头
-第4
张图片

其他的内容都一样,生成文件名如下:


springmvc实现文件上传下载
-程序员阿鑫-带你一起秃头
-第5
张图片

文件的下载:

 1.可以直接前端设置a标签连接文件地址:


springmvc实现文件上传下载
-程序员阿鑫-带你一起秃头
-第6
张图片

右击链接另存就可以下载了;

2.写一个后台控制器:

package com.zs.controller;

import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimeUtility;
import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;

@Controller
public class DownLoadController {

    @RequestMapping("/down")
    public ResponseEntity<byte[]> download(@RequestParam("filename") String filename, HttpServletRequest request) throws IOException {
        String path = request.getSession().getServletContext().getRealPath("/static/upload/");
        File file = new File(path + filename);

        String encodedFileName = null;
//        获取User-Agent,借此判断是哪儿种类型的浏览器
        String header = request.getHeader("User-Agent");
        if (header.indexOf("Chrome") > 0)
            encodedFileName = URLEncoder.encode(filename, "utf-8").replaceAll("+", "%20");
        else
            encodedFileName = MimeUtility.encodeWord(filename);

        byte[] bytes = FileUtils.readFileToByteArray(file);
        HttpHeaders headers = new HttpHeaders();
        //设置响应的文档类型:二进制形式
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        //弹出下载窗口,并制定文件名
        headers.setContentDispositionFormData("attachment", encodedFileName);
        //状态码
        HttpStatus httpStatus = HttpStatus.CREATED;
        ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, httpStatus);
        return responseEntity;
    }
}

前端页面传要下载的图片名:


springmvc实现文件上传下载
-程序员阿鑫-带你一起秃头
-第7
张图片

版权说明
文章采用: 《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权。
版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处,请联系站长删除。敬请谅解!

-- 展开阅读全文 --
这篇文章最后更新于2021-6-3,已超过 1 年没有更新,如果文章内容或图片资源失效,请留言反馈,我们会及时处理,谢谢!
Spring发送电子邮件
« 上一篇
Eclipse如何安装SVN插件?【联网篇】
下一篇 »

发表评论