小言_互联网的博客

【SpringMVC学习笔记】—— 【四】文件上传

298人阅读  评论(0)

👉 原文首发: 小牛肉的个人博客,欢迎来访~



一、传统方式的文件上传

传统方式的文件上传,指的是我们上传的文件和访问的应用存在于同一台服务器上。 并且上传完成之后,浏览器可能跳转。

1. 导入依赖

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

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

2. Jsp界面

<form action="/fileupload" method="post" enctype="multipart/form-data">
        <input type="file" name = "upload"/>
        <br/>
        <input type="submit" value="上传文件">
</form>

3. Controller控制器

//控制器类
@Controller
public class FileController {

    @RequestMapping("/fileupload")
    public String fileupload(HttpServletRequest request) throws Exception {
        // 先获取到要上传的文件目录
        String realPath = request.getSession().getServletContext().getRealPath("/uploads");
        // 创建File对象,一会向该路径下上传文件
        File file = new File(realPath);
        // 判断路径是否存在,如果不存在,创建该路径
        if(!file.exists()){
            file.mkdirs();
        }
        // 创建磁盘文件项工厂
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
        // 解析request对象
        List<FileItem> list = servletFileUpload.parseRequest(request);
        // 遍历
        for(FileItem fileItem : list){
            // 判断文件项是普通字段,还是上传的文件
            if(fileItem.isFormField()){

            }
            // 上传文件项
            else{
                // 获取到上传文件的名称
                String filname = fileItem.getName();
                // 上传文件
                fileItem.write(new File(file,filname));
                // 删除临时文件
                fileItem.delete();
            }
        }
        return "success";
    }
}

4. 运行结果

文件会上传到 target 目录下的 uploads 文件夹

二、 SpringMVC传统方式的文件上传

同样需要导入上一步的pom依赖文件

原理如下:

1. 配置文件解析器

springmvc.xml

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

注意: 文件上传的解析器 id是固定的,不能起别的名称,否则无法实现请求参数的绑定。(不光是文件,其他 字段也将无法绑定)

2. Jsp界面

<form action="/fileUpload2" method="post" enctype="multipart/form-data">
        名称:<input type="text" name="picname"/><br/>
        图片:<input type="file" name="uploadFile"/><br/>
        <input type="submit" value=" 上传 "/> 
    </form>

3. Controller控制器

@RequestMapping("/fileUpload2")
    // 参数picname、uploadFile要和jsp界面的name一致
    public String FileUpload2(String picname, MultipartFile uploadFile, HttpServletRequest request) throws IOException {
        // 1. 定义文件名
        String fileName = "";
        // 获取原始文件名
        String uploadFileName = uploadFile.getOriginalFilename();
        // 截取文件扩展名
        String extendName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1, uploadFileName.length());
        // 把文件加上随机数,防止文件重复
        String uuid = UUID.randomUUID().toString().replace("-","").toUpperCase();
        // 判断是否输入了文件名
        if(!StringUtils.isEmpty(picname)){
            fileName = uuid + "_" + picname + "." + extendName;
        }
        else{
            fileName = uuid + "_" + uploadFileName;
        }
        System.out.println(fileName);

        // 2. 获取到要上传的文件目录
        String realPath = request.getSession().getServletContext().getRealPath("/uploads");
        // 3. 创建File对象,一会向该路径下上传文件
        File file = new File(realPath);
        // 判断路径是否存在,如果不存在,创建该路径
        if(!file.exists()){
            file.mkdirs();
        }

        // 4. 使用 MulitpartFile 接口中方法,把上传的文件写到指定位置
        uploadFile.transferTo(new File(file, fileName));
        return "success";
    }

4. 运行结果

三、SpringMVC跨服务器方式的文件上传


此处我们用两个 Tomcat 服务器模拟应用服务器和图片服务器

1. 新建一个Tomcat服务器存储图片

新建一个 fileuploadserver web工程

在webapp 下创建uploads文件夹用来存储图片

同时需要在target目录下创建uploads文件夹(这一步很重要,不做的话会报409错误)

Tomcat 服务器配置,注意修改端口号

还需要在web.xml中修改serlvet权限,servlet默认权限是只读 (这步不做会报405错误)

<web-app>

  <display-name>Archetype Created Web Application</display-name>

  <servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
      <param-name>debug</param-name>
      <param-value>0</param-value>
    </init-param>
    <init-param>
      <param-name>readonly</param-name>
      <param-value>false</param-value>
    </init-param>
    <init-param>
      <param-name>listings</param-name>
      <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
</web-app>

org.apache.catalina.servlets.DefaultServlet 会爆红,不用理会,我们只需要能够修改权限就可以了

OK,至此,图片服务器 fileupload 的配置完毕,接下来开始应用服务器 springmvc 的配置和代码编写

2. 导入依赖

<dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-core</artifactId>
      <version>1.18.1</version>
    </dependency>
    
    <dependency>
      <groupId>com.sun.jersey</groupId>            
      <artifactId>jersey-client</artifactId>            
      <version>1.18.1</version>        
    </dependency>

3. Jsp界面

<form action="/fileUpload3" method="post" enctype="multipart/form-data">
        图片:<input type="file" name="uploadFile"/><br/>
        <input type="submit" value=" 上传 "/>
</form>

4. Controller控制器

 @RequestMapping(value = "/fileUpload3")
    // 参数picname、uploadFile要和jsp界面的name一致
    public String FileUpload3(MultipartFile uploadFile) throws IOException {
        System.out.println("SpringMVC跨服务器方式的文件上传......");
        //定义图片服务器的请求路径
        String path = "http://localhost:9090/uploads/";
        //获取到上传文件的名称
        String filename = uploadFile.getOriginalFilename();
        // 把文件加上随机数,防止文件重复
        String uuid = UUID.randomUUID().toString().replace("-", "").toUpperCase();
        // 文件名称唯一化
        filename = uuid + "_" + filename;

        //向图片服务器上传文件
        // 1. 创建客户端对象
        Client client = Client.create();
        // 2. 连接图片服务器
        WebResource resource = client.resource(path + filename);
        // 3. 上传文件
        resource.put(uploadFile.getBytes());

        return "success";
    }

5. 运行结果

最终图片保存在 图片服务器 的 target 文件夹下的 uploads 中


转载:https://blog.csdn.net/qq_41133986/article/details/105088518
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场