springmvc和传统的文件上传

一.传统的文件上传

文件上传三要素

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

java代码的实现

public String fileupload1(HttpServletRequest request) throws Exception {
    //getRealPath是从当前servlet 在tomcat 中的存放文件夹开始计算起的
    //E:\idea\SpringMvc_02\target\SpringMvc_02\uploads\
    //getServletContext获取servlet的上下文引用,一个web工程只有一个
    String path = request.getSession().getServletContext().getRealPath("/uploads/");
    File file = new File(path);
    if (!file.exists()) {
        file.mkdirs();//如果不存在则创建文件夹
    }
    /**创建磁盘文件项工厂
     * 当上传的文件项目比较小时,直接保存在内存中(速度比较快),
     * 比较大时,以临时文件的形式,保存在磁盘临时文件夹
     * (虽然速度慢些,但是内存资源是有限的)。
     */
    DiskFileItemFactory factory = new DiskFileItemFactory();
    //ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成一个FileItem对象中
    ServletFileUpload fileUpload = new ServletFileUpload(factory);
    // 解析request对象
    //parseRequest只是从查询字符串和请求体中获取参数赋值到paramMap,然后格式化uri,填充Request对象实例
    List<FileItem> list = fileUpload.parseRequest(request);
    /**
     * ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成一个FileItem对象中, 
     * 在使用ServletFileUpload对象解析请求时需要根据DiskFileItemFactory对象的属性sizeThreshold(临界值)和repository(临时目录)
     * 来决定将解析得到的数据保存在内存还是临时文件中,如果是临时文件,保存在哪个临时目录中?。
     * 所以,我们需要在进行解析工作前构造好DiskFileItemFactory对象,
     */
    for (FileItem fileItem : list) { // 判断文件项是普通字段,还是上传的文件
        if (fileItem.isFormField()) {
        } else {
            // 获取到上传文件的名称
            String filename = fileItem.getName();
            // 上传文件
            fileItem.write(new File(file, filename)); 
            // 删除临时文件 
            fileItem.delete();
        }
    }
    return "success";
}

3.导入的maven

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

二.springmvc的文件上传

2.1xml的配置

<!--配置文件解析器解析request  multipartResolver必须是叫这个名字-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="10485760"></property>
</bean>

2.2java的代码实现

@RequestMapping("fileupload2")
//upload必须和表单的type为file的name属性一样
public String fileupload2(HttpServletRequest request,MultipartFile upload) throws Exception{
    String path = request.getSession().getServletContext().getRealPath("/uploads/");
    File file = new File(path);
    if (!file.exists()) {
        file.mkdirs();//如果不存在则创建文件夹
    }
    // 获取到上传文件的名称
    String filename = upload.getOriginalFilename();
    String uuid = UUID.randomUUID().toString().replace("-", "");
    filename = uuid + "_" + filename;
    upload.transferTo(new File(path, filename));
    return "success";
}

三.跨服务器的文件上传

3.1导入maven坐标

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

3.2编写java代码

@RequestMapping("/fileupload3")
public String fileupload3(MultipartFile upload) throws Exception {
    System.out.println("SpringMVC跨服务器方式的文件上传...");
    // 定义图片服务器的请求路径 
    String path = "http://localhost:9090/day02_springmvc5_02image/uploads/";
    // 获取到上传文件的名
    String filename = upload.getOriginalFilename();
    String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
    // 把文件的名称唯一化
    filename = uuid + "_" + filename;
    // 向图片服务器上传文件 
    // 创建客户端对象
    Client client = Client.create();
    // 连接图片服务器 
    WebResource webResource = client.resource(path + filename);
    // 上传文件 
    webResource.put(upload.getBytes());
    return "success";
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值