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

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

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-web</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-test</artifactId>
  13. </dependency>
        //Ly-common包含了自定义异常处理
  14. <dependency>
  15. <groupId>com.leyou.common</groupId>
  16. <artifactId>Ly-common</artifactId>
  17. <version>1.0-SNAPSHOT</version>
  18. </dependency>
  19. </dependencies>

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

  1. server:
  2. port: 8082
  3. spring:
  4. application:
  5. name: upload-service
  6. servlet:
  7. multipart:
  8. max-file-size: 5MB # 限制文件上传的大小
        max-request-sieze: 10MB #限制每次请求的上传的文件大小 
  9. # Eureka
  10. eureka:
  11. client:
  12. service-url:
  13. defaultZone: http://127.0.0.1:10086/eureka
  14. instance:
  15. lease-renewal-interval-in-seconds: 5 # 每隔5秒发送一次心跳
  16. lease-expiration-duration-in-seconds: 10 # 10秒不发送就过期
  17. prefer-ip-address: true
  18. ip-address: 127.0.0.1

4.起动类

  1. @SpringBootApplication
  2. @EnableDiscoveryClient
  3. public class LyUploadApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(LyUploadApplication.class);
  6. }
  7. }

5.接受参数name="file"

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

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

6.文件上传

  1. @Service
  2. @Slf4j
  3. public class UploadService {
  4.  
  5. private static final List<String> ALLOW_TYPES= Arrays.asList("image/jpeg","image/png");
  6. public String uploadImg(MultipartFile file) {
  7. try {
  8.  
  9. //检验文件的类型 防止恶意文件
  10. String contentType = file.getContentType();
  11. if (!ALLOW_TYPES.contains(contentType)){
  12. throw new LyException(ExceptionEnum.INVALID_FILE_TYPE);
  13. };
  14. //校验文件的内容
  15. BufferedImage image = ImageIO.read(file.getInputStream());
  16. if (image==null){
  17. throw new LyException(ExceptionEnum.INVALID_FILE_TYPE);
  18. }
  19. //保存文件到本地
  20. File local = new File("F:\\javaee\\IdeaResource\\uploadImg\\",file.getOriginalFilename());
  21. file.transferTo(local);
  22. //返回文件地址
  23. return "http://image.leyou.com/"+file.getOriginalFilename();
  24. } catch (IOException e) {
  25. log.error("上传失败",e);
  26. throw new LyException(ExceptionEnum.UPLOAD_FILE_ERROR);
  27. }
  28. }
  29. }

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

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

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

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

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

      2.上传图片

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

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

7测试    

返回地址上传成功

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

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

  1. # 上传路径的映射
  2. server {
            listen       80;
            server_name  api.leyou.com;
  3.  
  4.         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;
  5.  
  6.         location /api/upload {
                rewrite "^/(.*)$" /zuul/$1;
                proxy_pass http://192.168.11.82:8082;
            }
  7.  
  8.         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

    1. "^/(.*)$" /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. 使用C++视频播放器库libvlc

    libvlc简介 vlc是一个开源的视频播放器,并提供了库供二次开发,其视频解码库是ffmpeg,网络库是live555.

  2. python实现百度OCR图片识别

    一.直接上代码 import base64 import requests class CodeDemo: def __init__(self,AK,SK,code_url,img_path): se ...

  3. JSON对象和字符串之间的相互转换 – JSON.parse() 和 JSON.stringify()

    所有现代浏览器都支持 JSON 对象,有两个非常有用的方法来处理 JSON 格式的内容: JSON.parse(string) :接受一个 JSON 字符串并将其转换成一个 JavaScript 对象 ...

  4. MR 原理

    MapReduce的执行步骤: 1.Map任务处理 1.1 读取HDFS中的文件.每一行解析成一个<k,v>.每一个键值对调用一次map函数.                <0,h ...

  5. 三种方法实现MNIST 手写数字识别

    MNIST数据集下载: import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist ...

  6. day 62 Django基础之jQuery操作cookie

    Django基础之jQuery操作cookie   jquery之cookie操作 定义:让网站服务器把少量数据储存到客户端的硬盘或内存,从客户端的硬盘读取数据的一种技术: 下载与引入:jquery. ...

  7. k8s 是什么,有什么功能

    k8s是一个docker集群的管理工具 k8s是容器的编排工具 1. k8s的核心功能 自愈: 重新启动失败的容器,在节点不可用时,替换和重新调度节点上的容器,对用户定义的健康检查不响应党的容器会被中 ...

  8. Post Office IOI 2000 /// 区间DP oj24077

    题目大意: 给定n个村庄的坐标,两个村庄之间的距离是其坐标之差的绝对值 最多能选m个村庄设立邮局,求设立邮局的地点使得各村庄与邮局距离总和最小 一, 所有的村庄看做在一条直线上 考虑三个因素:i 当前 ...

  9. FingerPrint Fuzzy Vault Matlab实践

    本文实践了指纹识别生物特征识别研究论文A Fuzzy Vault Scheme的算法部分.原文请查看以下链接: Juels, A. & Sudan, M. Des Codes Crypt (2 ...

  10. PHPExcel SUM 返回0

    使用PHPExcel 导出Excel最后的代码是: $objWriter = PHPExcel_IOFactory::createWriter($this->excel, 'Excel2007' ...