SpringMVC跨服务器上传文件中的坑


1、需要用到两个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>
2、tomcat默认是开启只读的,上传文件需要先关闭。具体做法:找到tomcat的conf文件夹下的web.xml文件,打开,找到<servlet>标签,代码如下:
<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>listings</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
在其中添加如下的初始化参数,将只读关闭
	<init-param>
		<param-name>readonly</param-name>
		<param-value>false</param-value>
	</init-param>
3、接下来先看实现代码,再说其中比较坑的地方
index.jsp
<h4>跨服务器上传文件</h4><br>
<form action="user/fileUploadCrossServer" method="post" enctype="multipart/form-data">
  选择文件:<input type="file" name="upload"><br>
  <input type="submit" value="上传">
</form>
注意:
① form表单的method必须为post,必须有enctype='multipart/form-data’属性
② input标签的type= ‘file’,且必须name属性


FileUploadController.java
@RequestMapping("/fileUploadCrossServer")
  public String fileUploadCrossServer(MultipartFile upload) throws IOException {
    System.out.println("跨服务器上传文件");
    // 定义文件上传路径
    String path = "http://localhost:9090/uploads/";
    // 获取文件名并重写构建
    String filename = upload.getOriginalFilename();
    // 使用URLEncoder对文件名进行编码
    filename = URLEncoder.encode(filename, "UTF-8");
    // 使用UUID构建唯一文件名
    filename = UUID.randomUUID().toString().replaceAll("-", "") + "_" + filename;
    // 创建客户端
    Client client = Client.create();
    // 连接图片服务器
    WebResource webResource = client.resource(path + filename);
    // 上传
    webResource.put(upload.getBytes());
    return "success";
  }
注意:
① 方法参数MultipartFile upload这里的形参名upload必须和前端页面index.jsp中file类型的input的name属性值一样
②构建上传的文件名这里,首先要使用java.net.URLEncoder进行编码,以解决中文乱码的问题,其次要使用UUID构建出唯一的文件名,以避免因为名称相同而相互覆盖
springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans.xsd 
       http://www.springframework.org/schema/context 
       http://www.springframework.org/schema/context/spring-context.xsd 
       http://www.springframework.org/schema/mvc 
       http://www.springframework.org/schema/mvc/spring-mvc.xsd">


  <!--配置自动扫描的包-->
  <context:component-scan base-package="com.espen"/>
  <!--配置视图解析器-->
  <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/"/>
    <property name="suffix" value=".jsp"/>
  </bean>
   <!--开启springmvc注解支持-->
  <mvc:annotation-driven/>
  <!--配置静态资源映射-->
  <mvc:resources mapping="/static/**" location="/static/"/>
  <!--配置文件解析器-->
  <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
</beans>
注意:
除了视图解析器和注解支持、静态资源映射等,还需要配置一个文件解析器,使用CommonsMultipartResolver
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值