zl程序教程

您现在的位置是:首页 >  后端

当前栏目

spring cloud zuul实现上传文件

2023-09-27 14:22:12 时间

正常情况下,我们使用普通的响应层(如SpringMVC)框架,是可以上传任意大小的文件的。在SpringMVC,是通过其“multipartResolver”这个Bean的设置,指定其“MaxUploadSize”参数的具体数字,来控制上传文件的具体大小的。

Zuul作为服务网关的情况下,也是可以上传文件的,Zuul在做文件上传的时候,只支持小文件的上传(1M以内),大文件(10M以上)上传会则报错,这是Zuul对文件上传的默认的设置。

新建一个上传项目:ms-zuul-fileupload

1.pom文件:

       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>

2.修改配置文件:

 

server:
  port: 8009
spring:
  application:
    name: ms-zuul-fileupload
  servlet:
      multipart:
        max-file-size: 500Mb      # Max file size,默认1M
        max-request-size: 1000Mb   # Max request size,默认10M
eureka:
  client:
    healthcheck:
      enabled: true
    serviceUrl:
      defaultZone: http://ljf:123@localhost:8761/eureka
  instance:
    prefer-ip-address: true
    instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}

turbine:
  aggregator:
    clusterConfig: ljf-turbine,ljf-feigin
  app-config: ms-hystrix-consumer,ms-fegin-consumer
  cluster-name-expression: metadata['cluster']
  combine-host-port: true
#设置查看指标
management:
  endpoint:
    health:
      show-details: always
  endpoints:
    web:
      exposure:
        include: "*"

3.controller:

package com.ljf.weifuwu.springcloud.fileupload.zuul.controller;

import org.springframework.stereotype.Controller;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@Controller
public class FileUploadController {

 /**
    * 上传文件
    * ps.该示例比较简单,没有做IO异常、文件大小、文件非空等处理
    * @param file 待上传的文件
    * @return 文件在服务器上的绝对路径
    * @throws IOException IO异常
    */
 @RequestMapping(value = "/zuul-Upload", method = RequestMethod.POST)
 public @ResponseBody String handleFileUpload(@RequestParam(value = "zuulFile", required = true) MultipartFile file) throws IOException {
     System.out.println("上传功能,controller!!!!");
     byte[] bytes = file.getBytes();
     File fileToSave = new File(file.getOriginalFilename());
     FileCopyUtils.copy(bytes, fileToSave);
     System.out.println("文件上传存储路径:"+fileToSave.getAbsolutePath());
     return fileToSave.getAbsolutePath();
 }


}

 

 4.启动类:

package com.ljf.weifuwu.springcloud.fileupload.zuul;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * Hello world!
 *
 */
@SpringBootApplication
@EnableEurekaClient
public class ZuulFileUploadApp
{
    public static void main( String[] args )
    {

        SpringApplication.run(ZuulFileUploadApp.class, args);
        System.out.println( "zuul-fileupload启动起来了!" );
    }
}

5.index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>zuul实现上传文件页面</title>
</head>
<body>
<div style="width:800px;height:300px;border:1px solid red">
    <span>
         <form method="POST" enctype="multipart/form-data" action="/zuul-Upload"> 
               <span style="width:100px;"> 请选择上传的文件</span>:<span style="width:300px;"><input type="file" name="zuulFile"></span>
                  <span>提交: <input type="submit" value="Upload"></span>
        </form>
    </span>

</div>
</body>
</html>

 

6.启动服务:ms-eureka-center(8761)、ms-zuul-consumer(8008)、ms-zuul-fileupload(8009)

6.直接访问ms-zuul-fileupload进行访问:

 6.1上传一个小文件871kb

 上传成功!!!

  

7.通过zuul进行上传

在index.hmtl中的action跳转路径改为:http://localhost:8008/user-fileupload/zuul-Upload

在启动类中加: multipartConfigElement()方法

package com.ljf.weifuwu.springcloud.fileupload.zuul;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;

import javax.servlet.MultipartConfigElement;

/**
 * Hello world!
 *
 */
@SpringBootApplication
@EnableEurekaClient
public class ZuulFileUploadApp
{
    /**
     * 文件上传配置
     *
     * @return
     */
    @Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        //  单个数据大小
        factory.setMaxFileSize("500000KB"); // KB,MB
        /// 总上传数据大小
        factory.setMaxRequestSize("1000000KB");
        return factory.createMultipartConfig();
    }
    public static void main( String[] args )
    {

        SpringApplication.run(ZuulFileUploadApp.class, args);
        System.out.println( "zuul-fileupload启动起来了!" );
    }
}

 

 

 还是上传不成功,需要对网关项目进行配置,在网关项目ms-zuul-consumer,添加要访问的项目

在启动类上加配置: multipartConfigElement()方法

package com.ljf.weifuwu.springcloud.zuul;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;

import javax.servlet.MultipartConfigElement;

/**
 * Hello world!
 *
 */
@SpringBootApplication
@EnableZuulProxy
public class ZuulConsumerApp

{

    /**
     * 文件上传配置
     *
     * @return
     */
    @Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        //  单个数据大小
        factory.setMaxFileSize("500000KB"); // KB,MB
        /// 总上传数据大小
        factory.setMaxRequestSize("1000000KB");
        return factory.createMultipartConfig();
    }

    public static void main(String args[]){
    SpringApplication.run(ZuulConsumerApp.class, args);
    System.out.println( "zuul启动起来了!" );
}

}

 再次启动:然后上传:  页面提示超时错误,但是后端已经上传成功!

通过上面的报错“microservice-file-upload timed-out and no fallback available.”我们可以了解到,主要原因还是因为请求处理超时,并且没有响应我们在上传大文件时,会因为上传时间过长,而导致hystrix认为该请求无响应,最终给客户端反馈了超时并没有响应的异常,我们只需在网关项目ms-zuul-consumer的application的配置文件中,提升hystrix的超时时间即可:

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 60000
ribbon:
  ConnectTimeout: 3000
  ReadTimeout: 60000

如截图: 

再次上传后:可以看到页面的提示了,返回了正确的上传路径。