设为首页 收藏本站
查看: 774|回复: 0

[经验分享] 跨域上传图片的尝试过程,最终成功了。哈哈

[复制链接]

尚未签到

发表于 2017-2-23 10:34:04 | 显示全部楼层 |阅读模式
  关于这个跨域上传图片的问题,其实去年底的时候就该去实现的,因为老板朝三暮四,一会儿让做这个,一会儿看那个,就耽误了。因为这个过程花费了我整整一天的时间,我认为有必要记录下来。
  首先,项目是一个ERP,针对的是公司的一个小型电商的网站。项目经理让我搭建一个图片服务器, 当时也是为了完(尝)成(尝)任(新)务(鲜),用的都是当时从没接触过的。通过百度就选择了 Nginx + Nodejs + express + ImageMagick 来实现的。 当时还简单看了一下淘宝的TFS(Taobao FileSystem)太高大上了,因为预估网站图片不会非常多,就用系统自带的文件系统。  Nodejs也是边学边写,可是调试express  这种MVC的时候,就不管用了。。。试了很久也不行。。。   就采用边看api 边打印出来调试。总算可以上传,下载浏览图片了。
  后来移至到项目中才发现,跨域是个很大的问题。图片服务器,提供一个接口。当时想了两套解决方案:


  • 先上传到项目中,然后再编写一个windows服务,来定时把上传的图片传到图片服务器中;
  • 在图片服务器上写一个页面,然后通过iframe嵌套在项目中。
  第二个解决方案直接被项目经理否决了,我也觉得写那么多东西不太好,也不想写这么多东西,只想一步到位。然后就花了一天的时间,查资料,实验。 当时可选的上传的控件有三个,原先项目里面的ajaxSubmit,领导推荐的plupload,我自己查到百度的webupload。 最后我当然选择使用我自己查到的了。 根据官方给出的api,demo来尝试写。  看到demo里面写的是server地址是以http开头的,不是项目中的相对路径。就以为是天然可以跨域,后来找到github上面issues里面,提到这个没有采用jquery file upload 的form post的形式,但是不采用这个可以实现文件修改的,也就实现上传前压缩,和分块上传这些功能的。
  然后为了跨域我做了这些尝试:


  • 修改nginx的代理,失败。
  • 修改nodejs的express里app.js,在response的消息头部加上下面这段代码, 失败。
    DSC0000.jpg
  • 后来我想,只需要在条用上传的方法的头部加上,后来使用chrome插件postman,模拟调用,发现POST可以接受到,POST跨域成功。
  • 后来发现WebUpload,会先发送一个OPTIONS的请求,百度了一下才发现,HTTP协议不止POST和GET。。


    浏览器在跨域请求前会发个options请求来验证是否跨域,所以后端再处理这个options请求时,要告诉浏览器一些信息。其实就是个header信息。


    HTTP请求方法并不是只有GET和POST,只是最常用的。据RFC2616标准(现行的HTTP/1.1)得知,通常有以下8种方法:OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE和CONNECT。
    OPTIONS方法是用于请求获得由Request-URI标识的资源在请求/响应的通信过程中可以使用的功能选项。通过这个方法,客户端可以在采取具体资源请求之前,决定对该资源采取何种必要措施,或者了解服务器的性能。

      OPTIONS请求方法的主要用途有两个:
      1、获取服务器支持的HTTP请求方法;也是黑客经常使用的方法。
      2、用来检查服务器的性能。例如:AJAX进行跨域请求时的预检,需要向另外一个域名的资源发送一个HTTP OPTIONS请求头,用以判断实际发送的请求是否安全。

  • 发现Webupload发送的OPTIONS请求,虽然阻止,但是,返回的状态码是200,也就是说Nginx是配置正确的,赶紧将Nginx配置改回来。
  • 后来灵光一闪,想起Express的路由好像会控制,接收什么协议的访问。然后赶紧尝试看看,成功了很是兴奋。


    var router=express.Router();
    var file_ctrl = require('../controller/filectrl')
    /**上传文件*/
    router.options('/upload',file_ctrl.upload);
    router.post('/upload',file_ctrl.upload);
  最后再放两张图,成功和失败 返回的Response Headers信息,确实不同。 基于这个,那不是所有的跨域问题都可以解决了,像网上说的Jsonp,iframe 完全都可以不用了。嘿嘿
DSC0001.jpg DSC0002.jpg

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-346097-1-1.html 上篇帖子: 创建一个提供数据 API 的 Node.js 网站 下篇帖子: 献给喜欢落网的朋友们
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表