SpringMVC 文件上传

客户端文件上传要求:

1,表单提交方式为post提交

2,提供文件上传组件,<input type="file">

3,表单的entype属于必须属于multipart/form-data,如果没有这个属性值的话,文件内容是提交不到服务器的。

服务器端要求:

1,获取到客户端上传的文件

2,准备一个目录存储客户端上传的文件

3,将上传的文件写入到目录中


SpringMVC封装了commons-fileupload,所以我们还需要添加commons-fileupload的依赖

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

在Spring.xml文件中配置文件解析器

<!--配置文件解析器,解析上传过来的文件-->
    <!--必须通过文件解析器的解析才能将文件转换为MultipartFile对象-->
    <!--必须设置id属性,springMVC是根据id获取,且id必须设置为multipartResolver-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--上传文件最大内存为5MB-->
        <property name="maxUploadSize" value="5242880"></property>
    </bean>

简单案例

客户端

<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="/file/upload" method="post" enctype="multipart/form-data">
        <input type="file" name="logo">
        <input type="submit" value="提交上传">
    </form>
</body>
</html>
@RestController
@RequestMapping("file")
public class FlieUploadController {
    /**
     * 1,获取客户端上传的文件的信息
     * 2,获取客户端上传的文件,存放到文件夹中,通过输出流存储到文件夹中
     *
     * 注意:!!!参数中MultipartFile的名字必须与客户端一致
     */
    @PostMapping("upload")
    public void upload( MultipartFile logo, HttpServletRequest httpServletRequest){

        //1,获取项目在编译后,存储文件夹的真实路径
        //优化目录
        Calendar instance = Calendar.getInstance();
        //日期做目录
        String dirDate = instance.get(Calendar.YEAR)+"/"+instance.get(Calendar.MONTH)+"/"+instance.get(Calendar.DATE);
        String realPath = httpServletRequest.getSession().getServletContext().getRealPath("file/"+dirDate);
        File file = new File(realPath);
        //判断file文件夹是否真实存在
        if(!file.exists()){
            //不存在
            //创建文件夹
            file.mkdirs();
        }
        //获取客户端上传的文件名
        String originalFilename = logo.getOriginalFilename();
        //获取后缀
        int i = originalFilename.lastIndexOf(".");
        String suffix = originalFilename.substring(i);
        //文件名用uuid代替文件名
        String filename = UUID.randomUUID()+suffix;
        try {
            //将客户端的文件写入到文件夹中
            logo.transferTo(new File(file,filename));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

FastDFS+Nginx搭建Java分布式文件系统-爱码网

简单的远程上传文件的案例

用tomcat做文件服务器,首先需要配置web.xml

tomcat默认不是允许其他服务器往自身写入数据的,需要在tomcat配置文件conf/web.xml的servlet标签下加上如下代码

        <init-param>
			<param-name>readonly</param-name>
			<param-value>false</param-value>
		</init-param>

 然后上传文件的服务端添加以下依赖

<!--跨服务器上传的依赖-->
    <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>

然后案例代码如下:

    @PostMapping("upload2")
    public void upload2(MultipartFile logo){
        //获取客户端上传的文件名
        String originalFilename = logo.getOriginalFilename();
        //获取后缀
        int i = originalFilename.lastIndexOf(".");
        String suffix = originalFilename.substring(i);
        //文件名用uuid代替文件名
        String filename = UUID.randomUUID()+suffix;

        //使用跨服务文件上传方式,将客户端文件上传到文件服务器中
        Client client = Client.create();
        //连接文件服务器路径
        WebResource resource = client.resource("http://localhost:8080/file/"+filename);
        try {
            resource.put(logo.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

posted @ 2022-07-26 12:40  在线电影制作人  阅读(6)  评论(0)    收藏  举报  来源