谏知中文网

悟已往之不谏,知来者之可追

远程附件API开发(基于webuploader与layer插件)

发表于 2016-08-15 3655 次浏览

最近项目不紧,抽空写了个远程附件接口,主要为了方便以后项目中使用。考虑到兼容性和扩展性,结合使用了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