文件上传 feigin_upload zuul

1. 单独的controller模块 功能是可以使用的

2. 加入负载均衡之后 文件上传出现问题
这里在负载均衡模块在进行请求转发的时候 实际上对原来的请求是做过处理的
原来的文件头 在这里已经被解析处理过 在此进行转发的时候 实际上是请求方法里面对应的参数重 新分装的请求头

如上图是实际的处理文件上传的方法声明以及对应的注解 (这里可以添加自定义头)此时单独使用是可以的正常的


这里是负载均衡对应的方法声明(这里使用的是fegin)下面是注意的点
1.在头部主注解(@FeginClient)里面必须添加 configuration这个属性 后面要添加对应的处理类
下面的这个是从网上找的 也可以自定拓展
引入对应的依赖
< dependency >
< groupId > io.github.openfeign.form </ groupId >
< artifactId > feign-form </ artifactId >
< version > 2.1.0 </ version >
</ dependency >
< dependency >
< groupId > io.github.openfeign.form </ groupId >
< artifactId > feign-form-spring </ artifactId >
< version > 2.1.0 </ version > </ dependency >
代码
@Configuration public class FeignMultipartSupportConfig {
@Bean
@Primary
@Scope ( "prototype" )
public Encoder multipartFormEncoder()
{ return new SpringFormEncoder(); }
@Bean public feign.Logger.Level multipartLoggerLevel()
{ return feign.Logger.Level.FULL; } }
引入这个配置类的原因是
普通的FeignClient远程调用代码。但是这样的实现,在去调用的时候一直抛异常: MissingServletRequestPartException,"Required request part  'file' is not present"
这里去跟踪:fileServerService.fileUpload(multipartFile, null, true)源码发现发送的url是将multipartFile以url的方式拼接在query string上。所以这样的调用肯定是不行的。
------------------------------from intenet
简单来说就是 :这里的请求已经被处理了 不在是浏览器的原生请求了 所以后台处理程序 不会接受处理的。
引入上面的配置 就是为了把请求头里面的文件部分(也可以适当添加别的参数 作为过滤与拦截)拿出来 还原成之前的那样 假装是浏览器发出来的(这样感觉麻烦 但是可以拿来做验证和文件过滤)

2. 这里的方法 文件file要使用@RequestPart 这个是浏览器发送文件的形式 tomcat在8之后 就是用part来处理文件的 这里应该是spring的借鉴 另外可以看到 后台处理文件的方法参数 和这里声明的方法的参数是不一致的,这是因为 后台处理的时候 是把fegin转发的请求 又当成是浏览器的请求重新解析了一遍 所以 fegin方法里传的东西 在这里会被重新解析 它也只能看到 fegin方法里面的参数的内容 别的都看不到 (所以在fegin里面的参数声明 要结合后台的需要 传入对应的参数)


以上总结 参考


这里有一个 git的项目
改天研究下


最后 zuul里面什么都不用配置我在上面的处理好之后 直接启动试了一下直接就ok了
网上说这个zuul里也要配置很多的东西 看来不用啊
哈哈

最后图片上传实在麻烦

http://note.youdao.com/noteshareid=199ba18e66e6f83ab6c4ca33a2c8d51f&sub=D41BD2F8506C411EAFA1AEB5775A0E27

这个和是有到笔记的原文 可以去看下点击打开链接




猜你喜欢

转载自blog.csdn.net/zhaoyu_nb/article/details/80579918