1.搭建一个新的微服务Ly-upload用来上传文件

2.导入文件上传到额依赖

<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
    //Ly-common包含了自定义异常处理
<dependency>
<groupId>com.leyou.common</groupId>
<artifactId>Ly-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>

3.编写application.yaml的文件配置

server:
port: 8082
spring:
application:
name: upload-service
servlet:
multipart:
max-file-size: 5MB # 限制文件上传的大小
    max-request-sieze: 10MB #限制每次请求的上传的文件大小 
# Eureka
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
instance:
lease-renewal-interval-in-seconds: 5 # 每隔5秒发送一次心跳
lease-expiration-duration-in-seconds: 10 # 10秒不发送就过期
prefer-ip-address: true
ip-address: 127.0.0.1

4.起动类

@SpringBootApplication
@EnableDiscoveryClient
public class LyUploadApplication {
public static void main(String[] args) {
SpringApplication.run(LyUploadApplication.class);
}
}

5.接受参数name="file"

当文件上传成功时返回一个文件路径   ResponseEntity.status(HttpStatus.OK).body(url);

@RestController
@RequestMapping("upload")
public class UploadController { @Autowired
private UploadService uploadService;
@PostMapping("image") //当文件上传的时候 SpringMvc会自动把上传的文件封装到MultipartFile中去
public ResponseEntity<String> uploadImg(@RequestParam("file") MultipartFile file) { String url=uploadService.uuploadImg(file);
     //
return ResponseEntity.status(HttpStatus.OK).body(url);
}
}
当文件上传的时候 SpringMvc会自动把上传的文件封装到MultipartFile中去。使用MultipartFile来接受文件
@RequestParam("file") MultipartFile file

6.文件上传

@Service
@Slf4j
public class UploadService { private static final List<String> ALLOW_TYPES= Arrays.asList("image/jpeg","image/png");
public String uploadImg(MultipartFile file) {
try { //检验文件的类型 防止恶意文件
String contentType = file.getContentType();
if (!ALLOW_TYPES.contains(contentType)){
throw new LyException(ExceptionEnum.INVALID_FILE_TYPE);
};
//校验文件的内容
BufferedImage image = ImageIO.read(file.getInputStream());
if (image==null){
throw new LyException(ExceptionEnum.INVALID_FILE_TYPE);
}
//保存文件到本地
File local = new File("F:\\javaee\\IdeaResource\\uploadImg\\",file.getOriginalFilename());
file.transferTo(local);
//返回文件地址
return "http://image.leyou.com/"+file.getOriginalFilename();
} catch (IOException e) {
log.error("上传失败",e);
throw new LyException(ExceptionEnum.UPLOAD_FILE_ERROR);
}
}
}

代码详解:1.防止恶意文件对文件进行简单的校验

       保证文件后缀名是我们规定的:

      private static  final List<String> ALLOW_TYPES= Arrays.asList("image/jpeg","image/png");
      Arrays.asList可以报我们 直接把参数转化成数组元素

         保证文件内容是图片:如果检验到图片则image为空

       //校验文件的内容
BufferedImage image = ImageIO.read(file.getInputStream());
if (image==null){
throw new LyException(ExceptionEnum.INVALID_FILE_TYPE);
}

      2.上传图片

        使用transferTo(dest)方法将上传文件写到服务器上指定的文件。

       //保存文件到本地
File local = new File("F:\\javaee\\IdeaResource\\uploadImg\\",file.getOriginalFilename());
file.transferTo(local);
//返回文件地址
return "http://image.leyou.com/"+file.getOriginalFilename();

7测试    

返回地址上传成功

8.服务器上传图片时非常消耗网关的时间资源

当nginx检测到收到的地址是/api/upload/*是不在向网关转发,而是直接转发到该资源所在的位置

# 上传路径的映射
server {
        listen       80;
        server_name  api.leyou.com;         proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;         location /api/upload {
            rewrite "^/(.*)$" /zuul/$1;
            proxy_pass http://192.168.11.82:8082;
        }         location / {
            proxy_pass http://192.168.11.82:10010;
            proxy_connect_timeout 600;
            proxy_read_timeout 600;
        }
    }
  • 首先,我们映射路径是/api/upload,而下面一个映射路径是 / ,根据最长路径匹配原则,/api/upload优先级更高。也就是说,凡是以/api/upload开头的路径,都会被第一个配置处理

  • proxy_pass:反向代理,这次我们代理到8082端口,也就是upload-service服务

  • rewrite

    "^/(.*)$" /zuul/$1;路径重写 去除http://api.leyou.com/api/upload/image中的api前缀

修改完成,输入nginx -s reload命令重新加载配置。然后再次上传试试。

leyou_05_文件上传的更多相关文章

  1. jquery.uploadify文件上传组件

    1.jquery.uploadify简介 在ASP.NET中上传的控件有很多,比如.NET自带的FileUpload,以及SWFUpload,Uploadify等等,尤其后面两个控件的用户体验比较好, ...

  2. 11、Struts2 的文件上传和下载

    文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...

  3. Java FtpClient 实现文件上传服务

    一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...

  4. 小兔Java教程 - 三分钟学会Java文件上传

    今天群里正好有人问起了Java文件上传的事情,本来这是Java里面的知识点,而我目前最主要的精力还是放在了JS的部分.不过反正也不麻烦,我就专门开一贴来聊聊Java文件上传的基本实现方法吧. 话不多说 ...

  5. ,net core mvc 文件上传

    工作用到文件上传的功能,在这个分享下 ~~ Controller: public class PictureController : Controller { private IHostingEnvi ...

  6. Web开发安全之文件上传安全

    很长一段时间像我这种菜鸡搞一个网站第一时间反应就是找上传,找上传.借此机会把文件上传的安全问题总结一下. 首先看一下DVWA给出的Impossible级别的完整代码: <?php if( iss ...

  7. AutoIt实现Webdriver自动化测试文件上传

    在运用WebDriver进行自动化测试时,由于WebDriver自身的限制,对于上传文件时Windows弹出的文件选择窗口无法控制,通过在网上查找资料锁定使用AutoIt来控制文件上传窗口. Auto ...

  8. Struts的文件上传下载

    Struts的文件上传下载 1.文件上传 Struts2的文件上传也是使用fileUpload的组件,这个组默认是集合在框架里面的.且是使用拦截器:<interceptor name=" ...

  9. .JavaWeb文件上传和FileUpload组件使用

    .JavaWeb文件上传 1.自定义上传 文件上传时的表单设计要符合文件提交的方式: 1.提交方式:post 2.表单中有文件上传的表单项:<input type="file" ...

随机推荐

  1. ROS 自定义消息类型方法

    流程 1.在package中新建文件夹名为msg 2.在msg文件夹中创建消息(此处以my_msg.msg)为例,注意的是要以msg为后缀名 内容举例如下: int32 data1 float64 d ...

  2. SQLite3与C++的结合应用

    SQLite并没有一次性做到位,只有下载这些东西是不能放在vs2010中并马上使用的,下载下来的文件中有sqlite3.c/h/dll/def,还是不够用的.我们需要的sqlite3.lib文件并不在 ...

  3. csp-s模拟测试86

    csp-s模拟测试86 分屋前的最后一次考试,我早就放弃了自己. 02:02:46 70 02:02:57 03:16:08 100 03:16:08 $T1$忘了按位计算,达哥按位计算的$T1$当时 ...

  4. 理解云计算三种服务模式——IaaS、PaaS和SaaS

    云计算的服务模式仍在不断进化,但业界普遍接受将云计算按照服务的提供方式划分为三个大类: SaaS(Software as a Service–软件即服务) PaaS(Platform as a Ser ...

  5. cordova开发笔记

    搜狐邮箱APP 使用了cordova框架,遇到了一些列问题,稍微总结记录下 扩展支持appInBrowser,用来以新窗口方式打开外链url 解决跨域问题(cordova默认当前域为localhost ...

  6. Java 的锁-老王女儿的爱情

    对象锁: new一个对象,都会给这个实例创建一把锁,对象中的方法必须在实例创建后,通过调用方法获取锁,一个线程进去这个方法之前拿到对象的锁,才能调用方法,否则被阻塞,举个例子,老王有个如花似玉的女儿, ...

  7. POJ 1873 /// 状压+凸包

    题目大意: 国王有一片森林,巫师需要从所有树中选出一些做成围栏把其他树围起来, 每棵树都有其对应的价值 v 和能作为围栏的长度 l 要求最小价值,若存在多种最小价值的方案则选择余下长度更少的 树木较少 ...

  8. NEO4J 图数据库使用APOC数据导入

       Neo4j 数据导入 一.安装与部署 直接在官网下载安装包安装,解压即可. 二.下载相应的jar包 apoc 包下载链接: https://github.com/neo4j-contrib/ne ...

  9. springcloud系列14 bus的使用

    首先springcloud_bus原理: (1)完整流程:发送端(endpoint)构造事件event,将其publish到context上下文中(spring cloud bus有一个父上下文,bo ...

  10. 批量处理数据 SqlBulkCopy

    string connectionString = new PublicDBHelper().GetCon(System.Configuration.ConfigurationManager.AppS ...