springMVC-10-文件上传

导入依赖(注意会和servlet-api依赖冲突)

<!--文件上传jar包, 前面已导过servlet-api需排除-->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
    <exclusions>
        <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

文件上传

upload.jsp

<%--enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。
    在此处这个编码格式,在java中接受的实例是:MultipartFile--%>
<form method="post" enctype="multipart/form-data">
    file:<input type="file" name="source"><br>
    <input type="submit" value="上传">
</form>

control

//接受文件
@RequestMapping(value = "file")
public String MyFile(MultipartFile source, HttpSession session) throws IOException {
    System.out.println("source---->>"+source);
    System.out.println("session--->>"+session);
    //获取上传文件的原始名称
    String originalFilename = source.getOriginalFilename();
    System.out.println("原始名称"+originalFilename);
    //获取上传文件的类型
    String contentType = source.getContentType();
    System.out.println("上传文件的类型"+contentType);
    //生成唯一的文件名防止提交的文件重名
    String uniqueFileName = UUID.randomUUID().toString();
    System.out.println("生成的唯一文件名"+uniqueFileName);
    //获取文件后缀名
    String extension = FilenameUtils.getExtension(originalFilename);
    System.out.println("文件后缀名"+extension);
    //把刚刚生成的唯一文件名和后来从原始文件名那里获取来的后缀组成完整的唯一文件名
    String uniqueFileName2 = uniqueFileName+"."+extension;
    System.out.println("唯一文件名(完整)"+uniqueFileName2);
    //返回该项目中参数目录的绝对路径
    String realPath = session.getServletContext().getRealPath("/upload");
    System.out.println("/upload目录的绝对路径:(这里有点问题"+realPath);
    //保存文件
    source.transferTo(new File(realPath+"//"+uniqueFileName2));
    return "success";
}

还需要注册(springmvc配置文件中)

<!--配置文件上传的解析器:
     mvc.xml 中注册上传解析器(id固定为 multipartResolver)-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!--以下属性可配可不配-->
        <!-- 默认编码 -->
        <property name="defaultEncoding" value="utf-8" />
        <!-- 设置multipart请求所允许的最大大小,默认不限制 -->
        <property name="maxUploadSize" value="10485760000" />
        <!-- 设置一个大小,multipart请求小于这个大小时会存到内存中,大于这个内存会存到硬盘中 -->
        <property name="maxInMemorySize" value="40960" />
</bean>

我们还需要创建对应的upload文件夹就比如现在我们就需要在D:\Coding\IntellijProjects\SpringMVC-Project\out\artifacts\MVC_4_dataHandle_war_exploded目录下创建upload,直接在项目下创建upload目录是没用的

文件下载

jsp界面

<a href="${pageContext.request.contextPath}/download?name=sample.txt">下载</a>

control(不需要返回值)

@RequestMapping(value = "/download")
public void download(String name, HttpSession session, HttpServletResponse response) throws IOException{
    String realPath = session.getServletContext().getRealPath("/upload");
    String filePath = realPath+"\\"+name;
    System.out.println("要下载的文件:"+filePath);
    //设置响应头,告知浏览器,要以附件的形式保存文件
    //filename=浏览器显示的文件下载名
    IOUtils.copy(new FileReader(filePath),response.getOutputStream());
}

另外还需要在指定的upload文件夹下放一个stample.txt文件

posted @ 2021-06-07 16:18  Coder-Wang  阅读(34)  评论(0编辑  收藏  举报