HTML5 规范定义了 File Api,可以和以往 Flash 上传一样,读取选择的文件信息,还可以监听上传进度显示在页面上。
跨域
使用flash实现时,若文件上传到的地址和当前上传的页面不在同一个域下面,则要加入 crossdomain.xml 跨域允许文件,Flash 会先去取上传地址上的文件看当前域是否得到许可,如果可以则执行上传。
HTML5 上传也有安全机制,一般情况下是不允许跨域上传的,上传前会先去使用http options方法探测有没有权限,地址为上传地址,所以要在上传地址里面加入允许。
在 Java 中,上传地址一般是 Servlet,需要在doPost和doOptions加上Header
doPost主要用于上传,doOptions用于上传过程中监听进度。也就是说没有加doOptions跨域允许也是可以上传的,只无法获取上传的进度,和表单上传没有什么区别。
@Override
protected void doPost(HttpServletRequest arg0, HttpServletResponse arg1)
throws ServletException, IOException {
arg1.setHeader("Access-Control-Allow-Origin", "*");
}
@Override
protected void doOptions(HttpServletRequest arg0, HttpServletResponse arg1)
throws ServletException, IOException {
arg1.setHeader("Access-Control-Allow-Origin", "*");
}
PHP等,只要在处理上在传的PHP里面加一句话即可
header('Access-Control-Allow-Origin','*');
允许多个域
要注意的是 Access-Control-Allow-Origin 只能有一个值,要么是*
即允许所有来源,一看就知道是不安全的。
另外还有一种是固定网址,如 http://www.xxx.com, 需要注意的是,只支持http://www.xxx.com,不能用 *.xxx.com来支持多个。所以如果要像Flash上传一样支持多个网站来源是不可能的,但可以通过代码解决
private String getCrossOrgin(requestUrl){
String[] safeurl = new String[]{"http://www.xxx.com","http://site.xxx.com"};
for(int i=0; i < safeurl.length ; i++){
if(requestUrl.startWith(safeurl[i])){
return safeurl[i];
}
}
return safeurl[0];
}