springmvc文件上传

1. 文件上传前提

  1. 修改form的默认提交方式
  2. 请求方式必须是post
  3. input 的type必须是file

分析:form默认的请求体为键值对,修改后请求体将分割为不同部分,包含上传文件信息。

  1. 借助第三方组件,解析上传的文件信息。
    1 commons-fileupload
    2 commons-io

2. 实现功能

  1. jsp页面
<form action="/fileUpload" method="post" enctype="multipart/form-data">
名称:<input type="text" name="picname"/><br/>
图片:<input type="file" name="uploadFile"/><br/>
<input type="submit" value="上传"/>
</form>
  1. controller
    ① 首先获取文件的上传位置,文件要放在那里
    拿到项目根目录,如何拿到项目根目录request.getSession().getServletContext().getRealPath("/uploads/");
    ② 创建File对象去操作文件或文件夹,判断路径是否存在,不存在就使用file.mkdirs去创建,如何判断file.exists().
    ③ controller需要接收request,用来获取上传的文件。
    ④ 使用第三方工具解析request,这套东西包含三个对象(DiskFileItemFactory、ServletFileUpload、FileItem)
    ⑤ 创建DiskFileItemFactory
    ⑥ 利用factory去创建ServletFileUpload
    ⑦ upload.paresRequest(request)去解析request,得到FileItem集合
    ⑧ 遍历该集合,判断是否是form上传,item.isFromField()这个方法是判断是不是普通表单项目,否在就是上传文件项。
    ⑨上传文件项,item就是我们上传的文件,获取文件名,使用uuid对文件名命名。
    ⑩uuid的写法
    String uuid = UUID.randomUUID().toString().replace("-","");
    对文件名进行拼接。
    使用item.write(new File(path,filename));
    将文件写入到路径中。
    使用item.delete(),清除临时文件。

2. springmvc上传文件

原理:
上传文件,主要是解析request,获得上传文件项,完成上传,我们上面从⑦ upload.paresRequest(request)获取FileItem,就是获取上传文件项,然后调用item.write(new File(path,filename)),完成上传。
springmvc帮我们获取上传文件项,我们需要配置文件解析器,然后在controller方法参数中使用MultipartFile去接收上传文件项,调用方法完成生产即可。
注意:input 中的name属性的名称,必须与controller方法参数MultipartFile名称相同。

2.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. id:multipartResolver 这个名称不能改
  2. class:CommonsMultipartResolver
bean.xml
<bean id="multipartResolver" <!-- id 的值是固定的-->
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大尺寸为 5MB --> <property name="maxUploadSize"> <value>5242880</value>
</property>
</bean>
  1. controller中
    ①获取地址,这个地址本案例中使用的是,项目根目录下的地址
    request.getSession().getServletContext().getRealPath("/uploads/");
    得到地址后判断是否存在,如果不存在就创建。
    ②文件名称的问题,先获取文件名称
    upload.getOriginalFilename(),在使用uuid去唯一化名称。
    ③使用upload.transferTo(new File(path,filename))完成上传。
@RequestMapping(value = "/upload02.do")
    public String upload02(HttpServletRequest request, MultipartFile upload)throws Exception{
        String path = request.getSession().getServletContext().getRealPath("/upload/");
        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";
    }

jsp

<form action="${pageContext.request.contextPath.toString()}/user/upload02.do" method="post" enctype="multipart/form-data">
    <input type="file" name="upload"/>
    <input type="submit" value="上传文件">
</form>

3. 跨服上传文件

使用的jar

<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>
  1. srpingmvc的方式去获取文件上传项
    配置CommonsMultipartResolver的bean,id为multipartResolver,controller方法中使用MultipartFile对象去获取文件上传项,input的name属性名称必须与MultipartFile 对象的名称相同
  2. 拿到文件上传项就可以使用jersey实现跨服上传。
    需要一个路径,和一个文件名称
    先创建对象,
    Client client = Client.create();
    设置路径和文件的名称(localhost:8888/…文件名称.jsp)
    WebResource webResource = client.resource(path+filename);
    上传文件 ,把文件上传项的字节数组传递过去。
    webResource.put(upload.getBytes());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值