SpringMVC——8.文件上传

1.环境设置

1. 1 导入jar包

<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>

1.2 文化上传的必要前提

1)form表单的enctype取值必须是:multipart/form-data (enctype时表单请求请求正文的类型)

2)mothod必须为post

3)提供一个文件选择域<input type="file" />

我们前面导入的commons-fileupload可以帮我们解析multipart/form-data 形式的表单数据

2.传统方式上传文件

1)网页

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h2>文件上传</h2>
    <form action="user/fileupload1" method="post" enctype="multipart/form-data">
        选择文件:<input type="file" name = "uplaod"/><br>
        <input type="submit" >
    </form>
</body>
</html>

2)控制器

@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/fileupload1")
    public String fileupload1(HttpServletRequest request) throws Exception {
        //保存文件路径
        String path = request.getSession().getServletContext().getRealPath("/uploads");
        File file = new File(path);
        //判断是否存在目标路径,没有就生成
        if (!file.exists()){
            file.mkdir();
        }
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        //获取文件
        List<FileItem> fileItems = upload.parseRequest(request);
        //判断是表单项目还是文件项目
        for (FileItem item:fileItems){
            if (item.isFormField()){

            }else{
                String filename = item.getName();
                //存放文件
                item.write(new File(path,filename));
                //删除临时文件
                item.delete();
            }
        }

        return "success";
    }
}

3.springMVC方式上传文件

springmvc通过控制器拦截网页传过来的请求,并通过文件解析器解析文件。解析完毕后再由控制器向对应处理方法中返回对应文件。

注:前端页面上文件的name必须与后台参数名一致,且前端的enctype和method都是固定的

1)网页

<h2>文件上传1</h2>
    <form action="user/fileupload2" method="post" enctype="multipart/form-data">
        选择文件:<input type="file" name = "uplaod2"/><br>
        <input type="submit" >
    </form>

2)配置文件解析器

<!--配置文件解析器-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>

3)处理器方法

@RequestMapping("/fileupload2")
    public String fileupload2(HttpServletRequest request,MultipartFile uplaod2) throws Exception {
        //保存文件路径
        String path = request.getSession().getServletContext().getRealPath("/uploads");
        File file = new File(path);
        //判断是否存在目标路径,没有就生成
        if (!file.exists()){
            file.mkdir();
        }
        uplaod2.transferTo(new File(path,uplaod2.getOriginalFilename()));

        return "success";
    }

4.跨服务器上传文件

图中表示的是跨服务器存储的一个流程

  1. 浏览器发起文件上传请求
  2. 应用服务器接收到文件
  3. 应用服务器将文件存入文件服务器
  4. 上传结束 

实践操作:

1.首先我们需要部署两个服务器,一个服务器用来存储文件,一个服务器用来处理请求,我这里将文件服务器起名为fileuload,处理请求的服务器名字默认

2.在文件服务器根目录下建立一个uploads文件夹用来存储文件

3.在应用服务器上编写页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h2>文件上传1</h2>
    <form action="user/fileupload3" method="post" enctype="multipart/form-data">
        选择文件:<input type="file" name = "uplaod2"/><br>
        <input type="submit" >
    </form>

</body>
</html>

4.这里省略web.xml与springmvc.xml的配置,前面都有

5.编写处理方法

@RequestMapping("/fileupload3")
    public String fileupload3(MultipartFile uplaod2) throws Exception {
        //保存文件路径
        String path = "http://localhost:9090/fileupload2_war_exploded/uploads/";

        String filename = uplaod2.getOriginalFilename();
        String uuid = UUID.randomUUID().toString().replace("-","");
        filename = uuid+filename;

        //创建客户端对象
        Client client = Client.create();

        //和图片服务器进行连接
        WebResource webResource = client.resource(path+filename);

        //上传文件
        webResource.put(uplaod2.getBytes());

        return "success";
    }

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原来是肖某人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值