文件上传(Servlet&&MVC)

1.文件上传三要素

  • 提供form表单,method必须是post
  • form表单的enctype必须是multipart/form-data
  • 提供input type="file"类型输入
  • fileupload.jsp大致代码如下
<%--
  Created by IntelliJ IDEA.
  User: weijisheng
  Date: 2022/2/28
  Time: 18:14
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件上传</title>
</head>
<body>
<center>
    <form action="/fileUpload.do" method="post" enctype="multipart/form-data">
        <tr>
            <td>姓名:</td>
            <td><input type="text" name="uname" value=""></td>
        </tr>
        <tr>
            <td>上传:</td>
            <td><input type="file" name="upFile" value=""></td>
        </tr>
        <input type="submit" value="提交">
    </form>
</body>
</center>
</html>

2.所需jar的两个jar包

commons-fileupload-xxx.jar
commons-io-xxx.jar

3. Servlet的上传解析

package upload;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;

@WebServlet("/fileUpload.do")
//当前servlet是处理文件上传的,数据类型是multipart
//当前servlet需要开启 multipart数据类型的配置,才能接受multipart中的数据
//在当前servlet中开始multipart的配置
@MultipartConfig
public class FileUploadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
        //    1.接受参数
        String name = request.getParameter("uname");
        //   2.文件类型的数据 这就是文件
        Part part = request.getPart("upFile");
        //    3.part得到的就是文件
        //    得到文件的名字
        String keyName = part.getName();//key的名字 upFile
        //getSubmittedFileName
        String fileName = part.getSubmittedFileName();//表单提交时 文件的名字
        System.out.println("key" + keyName);
        System.out.println("文件的名字" + fileName);
    //    3.服务器接收到了文件,把文件保存在指定位置
        String path="D:/Study/img";
        String uploadFile=path+"/"+fileName;
        //4.part中上传的方法
        part.write(uploadFile);
        resp.sendRedirect("FileSuccess.jsp");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

注意点:servlet-api的版本,旧版缺少方法
在这里插入图片描述
@MultipartConfig注解一定要注意

3.1 多文件上传的处理

思路:多文件上传的时候需要接收的是getParts,返回一个集合,再依次遍历。

4.服务器的路径

4.1获取上传文件的文件名

String filename = part.getSubmittedFileName();

4.2要作为存储到图片文件夹

String path=request.getServletContext().getRealPath("要上传的文件夹");

4.3文件上传的详细地址

String uploadPath=path+"/"+fileName

4.4 将文件写入到路径中,此处用封装

part.write(uploadPath);

5.虚拟路径

在这里插入图片描述
虚拟路径可以用作图片回显功能
在jsp中得到文件名字的话,可以通过

session.setAttribute("imgName",filename);
        resp.sendRedirect("FileSuccess.jsp");

把文件名字通过session域对象发放到某个jsp界面,在某个jsp界面通过拼接的方式得到文件,相当于直接访问虚拟路径地址。
<img src="${pageContext.request.contextPath}/img/${imgName}" />


**以上方式都是在servlet里面实验的。**

6.SpringMVC方式进行文件上传

6.1准备工作

准备pom文件,需要common-io和commons-fileupload

 <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>

在spring_servlet.xml里面进行视图解析器的配置

 <!--配置文件上传解析器-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 设置文件上传的最大尺寸为5MB-->
        <property name="maxUploadSize" value="5242880"></property>
    </bean>

注意:文件上传解析器是有id的,如果报错的话,注意id的配置

6.2 文件编写

form表单参考上面所示,都一样的。
mvc里面的java文件如下

MultipartFile goodPhoto,HttpServletRequest request
 //接收的文件名字
        //获取文件名字
        String filename = goodPhoto.getOriginalFilename();
        System.out.println("文件名" + filename);
        //将图片存储起来
        //获取上传路径
        String realPath = request.getServletContext().getRealPath("fileupload");
        System.out.println("realpath"+realPath);
        //拼接新路径
        String upload=realPath+"\\"+filename;
        System.out.println("文件最终上传路径"+upload);
        //上传文件
        goodPhoto.transferTo(new File(upload));
        //向后端传输值
        System.out.println("上传成功");

注意点:所需要的头文件的request来自HttpServletRequest
虚拟路径配置参考上面

6.3虚拟路径的存图方式

虚拟路径取值比较方便,但是存值的话不太方便,这时候我们需要手动去获取当前项目创建的文件夹路径,并将值存储进去。
ps:这种方式路径一般放在配置文件中,这里只是演示。
部分代码如下所示:

String filename=fileUpload.getOriginalFilename();
String filepath="D:\\Program Files\\idea project\\homeWork_ssm1\\src\\main\\webapp\\fileupload"+"\\"+filename;
        System.out.println("文件上传路径"+filepath);

7.获取项目运行时候的真实路径

7.1 web应用使用ServletContext

//通过HTTPServlet获取ServletContext


ServletContext servletContext = this.getServletContext();
 //获取文件的服务器真实路径
 //web目录下
String realPath = servletContext.getRealPath("/b.txt");
System.out.println(realPath);

7.2springboot项目常用的两种获取classes真实路径的方法

7.2.1使用ClassUtils

String path = ClassUtils.getDefaultClassLoader()
						.getResource("")
						.getPath();
    System.out.println(path);


7.2.2使用ResourceUtils

 try {
 String path2 = ResourceUtils.getURL("classpath:").getPath();
    System.out.println(path2);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值