HTML5 跨域提交和上传实现 及 nginx $_SERVER[‘HTTP_X_FILENAME’]解决

以下所涉及的基本都需要有服务器端的权限,没有请绕道~ ,当然也可以当学习哈~

GET

这个普通的jsonp就可以了,其实就是远程调个本地的函数。。谷歌去吧。

POST

发现个有意思的,就是file条件下可以无视跨域,这种做内置浏览器的时候可以好好利用下。

AJAX 这个是本篇最纠结的

普通提交依旧通过jsonp解决

关于表单提交和文件的上传

需要服务器端头的设置

相关原理参考: http://drops.wooyun.org/tips/188

服务器端的设置代码为

if (isset ( $_SERVER ['HTTP_ORIGIN'] )) {
	header ( "Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}" );
	header ( 'Access-Control-Allow-Credentials: true' );
	header ( 'Access-Control-Max-Age: 86400' ); // cache for 1 day
}
// Access-Control headers are received during OPTIONS requests
if ($_SERVER ['REQUEST_METHOD'] == 'OPTIONS') {

	if (isset ( $_SERVER ['HTTP_ACCESS_CONTROL_REQUEST_METHOD'] ))
		header ( "Access-Control-Allow-Methods: GET, POST, OPTIONS" );

	if (isset ( $_SERVER ['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'] ))
		header ( "Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}" );

	// exit(0);
}

 

XMLHttpRequest Level 2

是否支持跨域的脚本验证

var xhr = new XMLHttpRequest();
	if (typeof xhr.withCredentials == undefined) {
		document.write("fuck");
		//This browser does not support xhr2 yet.
	} else {
		document.write("true");
		//Go head!
	}

简单数据提交

	xhr.open("POST", "http://xxxxxxx", true);
	xhr.onload = function(data) {
		document.write("ok");
		document.write(data);
		//加载完咯...
	}
	//支持跨域发送cookies 改成true 就发不了... 和顺序没有关系
	//xhr.withCredentials = true;
	xhr.send();

 

上传相关文件从这获取,别人写好的,使用的是html5的特性。不过要积分。javaeye那边无需积分

http://blog.csdn.net/never_say_goodbye/article/details/8598521

上传的文件的提取不同于表单的提交,也不能简单通过查看chrome的表单请求头做判断

上传的文件名

$fn = (isset($_SERVER['HTTP_X_FILENAME']) ? $_SERVER['HTTP_X_FILENAME'] : false);

注:这样获取的文件名在apache下可用。在nginx 里会无法获取。可直接通过判断php://input进行文件传入判断,完善点可以再通过获取文件头判断文件类型

上传的文件数据,单个。。

file_get_contents('php://input')

转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827

Andriod 手机浏览器测试相关

电脑版的手机模拟器,不要拿那些只修改user-agent的脑残来说事哈!

Opera Mobile Classic Emulator

电脑端的极品,完全模拟,不用每次都切换到手机。。还可以复制粘贴。

http://www.opera.com/zh-cn/developer/mobile-emulator

Chrome mobile  Remote Debugging on Android

不亏是世界级的巨头,每次出的东西都是最最适合开发人员的。完全是从开发人员的角度解决了开发上的麻烦。下载和更新没有别的资源,当然哥也可以将更新好的弄上来哈。不过还是申请个vpn吧,一劳永逸。

https://developers.google.com/chrome-developer-tools/docs/remote-debugging?hl=zh-CN

 

中文参考:http://www.guao.hk/posts/how-to-do-remote-debugging-on-chrome-for-android.html

注:关于phonegap的测试,基本可以通过chrome启动前加参数解决

–disable-web-security 可以实现跨域 ,即ajax 可按原来的方式进行操作,包括文件的上传。

注:最新的版本需要远程调试,需要vpn支持,你懂的

 

手机mobile远程调试工具:

weinre 感觉比较方便,但是具体还得看日后的项目开发检测。主要新东西都有潜在问题。不过相当不错

注:这个东西只是在像phonegap这种特殊情况里,可以用于调试页面和简单的控制台脚本测试。。其它的还是奢望..

http://people.apache.org/~pmuellr/weinre/docs/latest/

QQ 授权跳过解决方法

最近在处理相关登录授权时发现这么一个问题,qq在经过第几次的授权操作之后,后续的操作会直接进行默认处理。这样导致一个问题,如果用户不小心勾了不分享到空间,腾讯微薄什么的。这样在论坛里的操作都会提示成网络繁忙。

经调试,系统的返回是该用户没有授权。导致一连串的奇怪问题和投诉。

解决方式。

直接修改:

http://connect.qq.com/toc/auth_manager?from=auth

QQ空间>(齿轮图)->空间设置->QQ登录

这里将给默认操作了的授权进行删除,再重新绑定进行设置就好。

转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827

 

zend studio 优化

http://bbs.phpchina.com/thread-220187-1-1.html

相关的启动项直接修改方式,只针对Zend Studio

Help>Welcome>右边的相关组件,选择自己需要的。或者只开启php,其它的都关了。

我的配置,软件5秒开启,一秒退出

-startup
plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.100.v20110502
--launcher.XXMaxPermSize
512m
--launcher.defaultAction
openFile
-showlocation
-name
Zend Studio
-vmargs
-Xms512M
-Xmx1024M
-XX:MaxPermSize=256m
-DGIT_SSL_NO_VERIFY=true
-Dsvnkit.http.sslProtocols=SSLv3

2.删除workspace,再重新引入项目

获取文件格式

通过字节识别文件

http://blog.sina.com.cn/s/blog_62b832910100vmbq.html

通过相关文件格式,获取文件实际类型

YII的代码

class FileTools{
	public static function getFileType($file,&$fileType,&$mime){
		$bin = substr($file,0,2);
		$strInfo = @unpack("C2chars", $bin);
		$typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
		$fileType = '';
		switch ($typeCode)
		{
			case 7790:
				$fileType = 'exe';
				return false;
				break;
			case 7784:
				$fileType = 'midi';
				return false;
				break;
			case 8297:
				$fileType = 'rar';
				return false;
				break;
			case 255216:
				$fileType = 'jpg';
				$mime = 'image/jpeg';
				return true;
				break;
			case 7173:
				$fileType = 'gif';
				$mime = 'image/gif';
				return true;
				break;
			case 6677:
				$fileType = 'bmp';
				$mime = 'image/bmp';
				return true;
				break;
			case 13780:
				$fileType = 'png';
				$mime = 'image/png';
				return true;
				break;
			default:
				return false;
				break;
		}
		return false;
	}
	public static function getMimeType($file,$magicFile=null,$checkExtension=true)
	{
		if(function_exists('finfo_open'))
		{
			$options=defined('FILEINFO_MIME_TYPE') ? FILEINFO_MIME_TYPE : FILEINFO_MIME;
			$info=$magicFile===null ? finfo_open($options) : finfo_open($options,$magicFile);

			if($info && ($result=finfo_file($info,$file))!==false)
				return $result;
		}

		if(function_exists('mime_content_type') && ($result=mime_content_type($file))!==false)
			return $result;
		return $checkExtension ? self::getMimeTypeByExtension($file) : null;
	}
	/**
	 * Determines the MIME type based on the extension name of the specified file.
	 * This method will use a local map between extension name and MIME type.
	 * @param string $file the file name.
	 * @param string $magicFile the path of the file that contains all available MIME type information.
	 * If this is not set, the default 'system.utils.mimeTypes' file will be used.
	 * This parameter has been available since version 1.1.3.
	 * @return string the MIME type. Null is returned if the MIME type cannot be determined.
	 */
	public static function getMimeTypeByExtension($file,$magicFile=null)
	{
		static $extensions;
		if($extensions===null)
			$extensions=$magicFile===null ? require('mimeTypes.php') : $magicFile;
		if(($ext=pathinfo($file, PATHINFO_EXTENSION))!=='')
		{
			$ext=strtolower($ext);
			if(isset($extensions[$ext]))
				return $extensions[$ext];
		}
		return null;
	}
}

 

实现google查询 需要外国服务器支持。

唉………苦逼

CURL版本

<base href="http://www.google.com.hk/">
<meta charset='utf-8'>
<?php
/**
 *
 * @author caihaibin
 */
@header ( "Content-Type: text/html;charset=utf-8" );
if (@$_REQUEST ['q']) {
	$data = urlencode ( $_REQUEST ['q'] );
	$url = "http://www.google.com.hk/search?hl=zh-CN&source=hp&q={$data}&btnG=Google+%E6%90%9C%E7%B4%A2&meta=lr%3Dlang_zh-CN&aq=f&aqi=&aql=&oq=&gs_rfai=";
} else {
	$url = "http://www.google.com.hk/";
}
$cookie_file = dirname ( __FILE__ ) . "/temp/google.txt";
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_USERAGENT, $_SERVER ['HTTP_USER_AGENT'] );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, 1 );
curl_setopt ( $ch, CURLOPT_COOKIEJAR, $cookie_file );
$contents = curl_exec ( $ch );
curl_close ( $ch );
$contents = preg_replace ( '/<form action="/search" id="tsf" method="GET"/', '<form action="http://' . $_SERVER ['HTTP_HOST'] . $_SERVER ['SCRIPT_NAME'] . '?caihaibin=ok" id="tsf" method="POST"', $contents );
echo $contents;
?>

HttpClient.class.php版本

<base href="http://www.google.com.hk/">
<?php
require 'HttpClient.class.php';
header ( "Content-Type: text/html;charset=utf-8" );
function test_cb($res, $req, $key) {
	// echo $res->body;
	// echo '[' . $key . '] url: ' . $req->getUrl() . ', ';
	// echo 'time cost: ' . $res->timeCost . ', ';
	// echo 'size: ' . number_format(strlen($res->body)) . "<Br>";
}

$http = new HttpClient ( 'test_cb' );
// 全部 URL 抓取完毕时一并返回,传入单个 URL 或数组组成的多个 URL
// 第一次请求可能因为域名解析等原因较慢
// 可以自行构造 HttpRequest 直接用 IP请求更快
if (@$_REQUEST ['q']) {
	$data = urlencode ( $_REQUEST ['q'] );
	$url = "http://www.google.com.hk/search?hl=zh-CN&source=hp&q={$data}&btnG=Google+%E6%90%9C%E7%B4%A2&meta=lr%3Dlang_zh-CN&aq=f&aqi=&aql=&oq=&gs_rfai=";
} else {
	$url = "http://www.google.com.hk/";
}
$results = $http->get ( array (
		'google' => $url 
) );
$contents = $results ['google']->body;
$contents = preg_replace ( '/<form action="/search" /', '<form action="http://' . $_SERVER ['HTTP_HOST'] . $_SERVER ['SCRIPT_NAME'] . '" method="POST"', $contents );
echo $contents;

 

微信,新浪,QQ的分享脚本

有时候bshare不太能满足自己的需求,或者不想为了一个小小的分享引用一堆杂七杂八的脚本怎么办?

其它各大公司都提供了简单的分享方式,bshare,jiathis也就是这些方便的集合体,或许说,做得更容易,更人性化了。

现在演示下单独一个的分享。(其实只要通过jiathis进行对应的分享,在浏览器的地址栏就可以获取对应的链接了,去官网的文档查看下也是有的)

qq

	const TYPE_QQ="qq";
	const TYPE_QQ_URL="http://connect.qq.com/widget/shareqq/index.html?";
	public static function getQqUrl($title,$summary,$url,$img){
		$querys=array(
			'title'=>$title, 
			'url'=>$url,
			'pics'=>$img,
			'summary'=>$summary,
			'desc'=>$summary,
		);
		return self::TYPE_QQ_URL.http_build_query($querys);
	}

微薄

	const TYPE_WEIBO="weibo";
	const TYPE_WEIBO_URL="http://service.weibo.com/share/share.php?";
	public static function getWeiboUrl($title,$summary,$url,$img){
		$querys=array(
			'title'=>$title."#".$summary,
			'url'=>$url,
			'pic'=>$img,
		);
		return self::TYPE_WEIBO_URL.http_build_query($querys);
	}

微信比较特别,只通过扫描的方式进行分享。然后再分享到朋友圈里。这样有比没有强了呵呵。

	const TYPE_WX="qq";
	const TYPE_WX_URL="https://open.weixin.qq.com/qr/set/?";
	const TYPE_WX_URL2="https://open.weixin.qq.com/qr/get/";
	//https://open.weixin.qq.com/qr/get/Z2HYZsVENp3hRmUA/ 获取对应的二维码
	/**
	 * 该二维码为一次性的,被扫后必须重新生成
	 * @param  $title
	 * @param  $summary
	 * @param  $url
	 * @param  $img
	 * @return string
	 */
	public static function getWXUrl($title,$summary,$url,$img){
		$querys=array(
			'title'=>$title."#".$summary,
			'url'=>$url,
			'img'=>$img,
			'appid'=>'',
			'a'=>1,
		);
		lib("http.class.php");
		$http=new http();
		$data=$http->get(self::TYPE_WX_URL.http_build_query($querys));
		if($data){
			$data=$http->get_data();
		}
		if(preg_match("/showWxBox("(w+)")/", $data,$match)){
			return self::TYPE_WX_URL2.$match[1]."/";
		}
	}

转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827

实现 HTTP response 回传文件(纯属蛋疼)

有兴趣的同学可以下个chrome,进行post和get访问时,数据流的查看。

可以发现,是浏览器将表单中的数据项按各种分隔的方式传送到服务器端。服务器通过文件头再进行相应的数据解析。包括文件上传也是这样子。

问题来了。 我上传文件没有问题,但是需要将服务器端生成的文件再获取回来。实现的方式有多种,闲得蛋疼。。模拟了HTTP的方式将数据以模拟enctype=”multipart/form-data”的方式返回,然后客户端这边再进行解析。

转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827