关于这个跨域上传图片的问题,其实去年末的时候就该去实现的,由于老板朝秦暮楚,一下子让作这个,一下子看那个,就耽误了。由于这个过程花费了我整整一天的时间,我认为有必要记录下来。node
首先,项目是一个ERP,针对的是公司的一个小型电商的网站。项目经理让我搭建一个图片服务器, 当时也是为了完(尝)成(尝)任(新)务(鲜),用的都是当时从没接触过的。经过百度就选择了 Nginx + Nodejs + express + ImageMagick 来实现的。 当时还简单看了一下淘宝的TFS(Taobao FileSystem)过高大上了,由于预估网站图片不会很是多,就用系统自带的文件系统。 Nodejs也是边学边写,但是调试express 这种MVC的时候,就无论用了。。。试了好久也不行。。。 就采用边看api 边打印出来调试。总算能够上传,下载浏览图片了。jquery
后来移至到项目中才发现,跨域是个很大的问题。图片服务器,提供一个接口。当时想了两套解决方案:nginx
第二个解决方案直接被项目经理否决了,我也以为写那么多东西不太好,也不想写这么多东西,只想一步到位。而后就花了一天的时间,查资料,实验。 当时可选的上传的控件有三个,原先项目里面的ajaxSubmit,领导推荐的plupload,我本身查到百度的webupload。 最后我固然选择使用我本身查到的了。 根据官方给出的api,demo来尝试写。 看到demo里面写的是server地址是以http开头的,不是项目中的相对路径。就觉得是自然能够跨域,后来找到github上面issues里面,提到这个没有采用jquery file upload 的form post的形式,可是不采用这个能够实现文件修改的,也就实现上传前压缩,和分块上传这些功能的。git
而后为了跨域我作了这些尝试:github
浏览器在跨域请求前会发个options请求来验证是否跨域,因此后端再处理这个options请求时,要告诉浏览器一些信息。其实就是个header信息。
HTTP请求方法并非只有GET和POST,只是最经常使用的。据RFC2616标准(现行的HTTP/1.1)得知,一般有如下8种方法:OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE和CONNECT。 OPTIONS方法是用于请求得到由Request-URI标识的资源在请求/响应的通讯过程当中可使用的功能选项。经过这个方法,客户端能够在采起具体资源请求以前,决定对该资源采起何种必要措施,或者了解服务器的性能。
OPTIONS请求方法的主要用途有两个:web
一、获取服务器支持的HTTP请求方法;也是黑客常用的方法。ajax
二、用来检查服务器的性能。例如:AJAX进行跨域请求时的预检,须要向另一个域名的资源发送一个HTTP OPTIONS请求头,用以判断实际发送的请求是否安全。chrome
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 彻底均可以不用了。嘿嘿express