最近项目不紧,抽空写了个远程附件接口,主要为了方便以后项目中使用。考虑到兼容性和扩展性,结合使用了webuploader和layer插件,内容比较基础,有需要的朋友可自行下载,局部做些修改即可使用。需求:
1. 图片上传(单图、多图)、附件上传(使用PHP上传)
2. 水印选择功能
3. 本地删除图片同时清理服务器上资源(安全问题自行考虑)
4. 跨域问题解决(包含域名限制)
5. 结构合理、操作编辑、兼容性、跨平台考虑等
关于upload_tmp_dir
写demo的时候发现本地可以上传,nginx服务器上不行,调试发现tmp_name总是空值,用ini_get('upload_tmp_dir')获取配置为空,以为没有设置临时目录,考虑动态修改配置,不生效,因为其修改范围是PHP_INI_SYSTEM
这里记录下php.ini选项的可修改规则:
可修改范围是 PHP_INI_PERDIR 的指令可以在php.ini、httpd.conf、.htaccess文件中修改
可修改范围是 PHP_INI_SYSTEM 的指令可以在php.ini、httpd.conf文件中修改
可修改范围是 PHP_INI_ALL 的指令可以用int_set修改
百度了一下,原来upload_tmp_dir没有单独设置时去默认值(/tmp),考虑应该是tmp空间满了,让运维人员清理下空间,问题解决
同源策略
只有设置相同的document.domain,才能保证保证父子域之间顺利传值,值只能是当前域名或者主域名,不能自定义。
在文件上传之前可预处理headers值进行限制,并在PHP后端设定Access-Control-Allow-Origin
//javascript 添加附带参数 uploader.on('uploadBeforeSend' , function(obj , data , headers ) { if(ischose) { data.setwatermark = 1; } var argDomain = [ //域名组 'baidu.com' , 'jyncode.com', ] ; var currentDomain = document.referrer; //来源域名 if(currentDomain) { var matchUrl = /^http:\/\/\w+(.)\w+(.com)/i; currentDomain = currentDomain.match(matchUrl)[0]; var match2url = /^http:\/\/\w+(.)/i; currentDomain = currentDomain.replace(match2url , '') ; } if(argDomain.in_array(currentDomain)) { headers['Access-Control-Allow-Origin'] = currentDomain; } else { layer.msg('你无权进行此操作');return false; } headers['Access-Control-Request-Headers'] = 'Content-Type'; headers['Access-Control-Request-Method'] = 'POST'; data.domain = document.referrer; }) ; //PHP header("Access-Control-Allow-Origin: http://jyncode.com");
源码下载:http://img.jyncode.com/jianzhi/20160816/UploadApi-master.rar