SpringMVC文件上传

1.    传统方式

前提

A form表单的 enctype取值必须是:multipart/form-data

         (默认值是:application/x-www-form-urlencoded)

       enctype:是表单请求正文的类型

B method 属性取值必须是 Post

C 提供一个文件选择域<inputtype=”file” />

pom依赖
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
</dependency>

 

jsp页面

<%@ page contentType="text/html;charset=UTF-8language="java" %>
<html>
<
head>
    
<title>Title</title>
</
head>
<
body>
<
form action="${pageContext.request.contextPath}/springmvc/fileupload1"method="post" enctype="multipart/form-data">
    
名称:<input type="text"name="picname"/><br/>
    
图片:<input type="file"name="uploadFile"/><br/>
    
<input type="submit"value="上传"/>
</
form>
</
body>
</
html>

 

controler
package lz.fileupload;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;

/**
 * @author 黑马程序员
 * @Company http://www.ithiema.com
 */
@Controller
@RequestMapping("springmvc")
public class FileUploadTestController1 {

    /**
     * 文件上传
     * @param request
     */
    @RequestMapping("fileupload1")
    public void testFileUpload(HttpServletRequest request)throws Exception{
        //1.找到上传文件的位置,需要使用ServletContext对象的getRealPath()
        String basePath = request.getSession().getServletContext().getRealPath("/uploads");
        System.out.println(basePath);
        //2.通过日期创建一个二级目录  /uploads/2018-06-19/
        String datePath = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        //3.判断目录是否存在,不存在就创建
        File file = new File(basePath,datePath);
        if(!file.exists()){
            file.mkdirs();
        }
        //4.创建文件项工厂对象
        FileItemFactory factory = new DiskFileItemFactory();

        //5.创建上传文件的核心对象
        ServletFileUpload upload = new ServletFileUpload(factory);

        //6.解析request,得到表单项的集合
        List<FileItem> items = upload.parseRequest(request);

        //7.遍历集合,取出每一项判断是不是文件
        for(FileItem item : items){
            //判断
            if(item.isFormField()){
                //true的时候是普通字段,非文件
            }else{
                //取出文件名
                String fileName = item.getName();
                //为了防止文件重名,我们需要随机化文件名
                String uuid = UUID.randomUUID().toString().replace("-","").toUpperCase();
                //设置随机文件名
                fileName = uuid+"_"+fileName;
                //向服务器写文件
                item.write(new File(file,fileName));
                //清除临时文件
                item.delete();
            }
        }
    }
}

 

如果选择war:explode会发布在项目target下,tomcat引用,

选择war则会在项目中打一个war包,复制一份到tomcat,webapp中

 

2.      springmvc 传统方式的文件上传

传统方式的文件上传,指的是我们上传的文件和访问的应用存在于同一台服务器上。

并且上传完成之后,浏览器可能跳转。

第一步:创建maven工程并导入commons-fileupload坐标

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

 

第二步:编写jsp页面

springmvcMuiltpartFile的使用
<form action="${pageContext.request.contextPath}/springmvc/fileupload2" method="post" enctype="multipart/form-data">
    <input type="file" name="uploadFile" ><br/>
    <input type="submit" value="上传">
</form>

第三步:编写控制器

package lz.fileupload;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

/**
 * @author 黑马程序员
 * @Company http://www.ithiema.com
 */
@Controller
@RequestMapping("springmvc")
public class FileUploadTestController2 {

    /**
     * 文件上传
     * 使用springmvc提供的MultipartFile对象实现
     * 该对象是作为控制器方法的形参来使用的,形参的变量名称必须和表单type=file的字段名称保存一致
     * @param request
     */
    @RequestMapping("fileupload2")
    public void testFileUpload(HttpServletRequest request, MultipartFile uploadFile)throws Exception{
        //1.找到上传文件的位置,需要使用ServletContext对象的getRealPath()
        String basePath = request.getSession().getServletContext().getRealPath("/uploads");
        //2.通过日期创建一个二级目录  /uploads/2018-06-19/
        String datePath = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        //3.判断目录是否存在,不存在就创建
        File file = new File(basePath,datePath);
        if(!file.exists()){
            file.mkdirs();
        }
        //4.取出文件名
        String fileName = uploadFile.getOriginalFilename();
        //为了防止文件重名,我们需要随机化文件名
        String uuid = UUID.randomUUID().toString().replace("-","").toUpperCase();
        //设置随机文件名
        fileName = uuid+"_"+fileName;
        //写文件
        uploadFile.transferTo(new File(file,fileName));
    }
}

第四步:配置文件解析器

<!-- 配置文件上传解析器 -->

<beanid="multipartResolver"  <!--id的值是固定的-->

 class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

 <!-- 设置上传文件的最大尺寸为 5MB -->

 <property name="maxUploadSize">

   <value>5242880</value>

 </property>

</bean>

注意:

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

字段也将无法绑定)

 

 

 

 

3.    跨服务器文件上传

 springmvc 跨服务器方式的文件上传

5.3.1 分服务器的目的

在实际开发中,我们会有很多处理不同功能的服务器。例如:

  应用服务器:负责部署我们的应用

  数据库服务器:运行我们的数据库

  缓存和消息服务器:负责处理大并发访问的缓存和消息

  文件服务器:负责存储用户上传文件的服务器。

(注意:此处说的不是服务器集群)

分服务器处理的目的是让服务器各司其职,从而提高我们项目的运行效率。

 

 

 

5.3.2 准备两个tomcat服务器,并创建一个用于存放图片的web工程

 

 

在文件服务器的 tomcat配置中加入,允许读写操作。文件位置:

 

 

 

5.3.3 导入 jersey的坐标

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

 

5.3.4 编写控制器实现上传图片

/**

 * 响应json数据的控制器

**/

@Controller("fileUploadController2")

public class FileUploadController2 {

 

 public  static  final String  FILESERVERURL  =

"http://localhost:9090/day06_spring_image/uploads/";

  /**

   * 文件上传,保存文件到不同服务器

   */

 @RequestMapping("/fileUpload2")

 public  StringtestResponseJson(String picname,MultipartFile uploadFile)  throws

Exception{

   //定义文件名

   String fileName = "";

   //1.获取原始文件名

   String uploadFileName = uploadFile.getOriginalFilename();

   //2.截取文件扩展名

   String  extendName  =

uploadFileName.substring(uploadFileName.lastIndexOf(".")+1,

uploadFileName.length());

   //3.把文件加上随机数,防止文件重复

   String  uuid  =UUID.randomUUID().toString().replace("-",  "").toUpperCase();

   //4.判断是否输入了文件名

   if(!StringUtils.isEmpty(picname)) {

     fileName = uuid+"_"+picname+"."+extendName;

   }else {

     fileName = uuid+"_"+uploadFileName;

    }

   System.out.println(fileName);

   //5.创建 sun公司提供的 jersey包中的 Client 对象

   Client client = Client.create();

   //6.指定上传文件的地址,该地址是web路径

   WebResource resource = client.resource(FILESERVERURL+fileName);

   //7.实现上传

   String result = resource.put(String.class,uploadFile.getBytes());

   System.out.println(result);

   return "success"; 传智播客——专注于 Java、.Net 和 Php、网页平面设计工程师的培训

北京市昌平区建材城西路金燕龙办公楼一层   电话:400-618-9090

 

  }

}

5.3.5 编写 jsp页面

<form action="fileUpload2"method="post" enctype="multipart/form-data">

   名称:<inputtype="text" name="picname"/><br/>

  图片:<inputtype="file" name="uploadFile"/><br/>

 <input type="submit" value="上传"/>

</form>

5.3.6 配置解析器

<!-- 配置文件上传解析器 -->

<beanid="multipartResolver" 

 class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

 <!-- 设置上传文件的最大尺寸为 5MB -->

 <property name="maxUploadSize">

    <value>5242880</value>

 </property>

</bean>

注意:此处 bean的id取值是固定的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值