PHP使用CURL上传|下载文件

原文链接

CURL下载文件

/**
 * @param string $img_url 下载文件地址
 * @param string $save_path 下载文件保存目录
 * @param string $filename 下载文件保存名称
 * @return bool
 */
function curlDownFile($img_url, $save_path = '', $filename = '') {
	if (trim($img_url) == '') {
		return false;
	}
	if (trim($save_path) == '') {
		$save_path = './';
	}

	//创建保存目录
	if (!file_exists($save_path) && !mkdir($save_path, 0777, true)) {
		return false;
	}
	if (trim($filename) == '') {
		$img_ext = strrchr($img_url, '.');
		$img_exts = array('.gif', '.jpg', '.png');
		if (!in_array($img_ext, $img_exts)) {
			return false;
		}
		$filename = time() . $img_ext;
	}

	// curl下载文件
	$ch = curl_init();
	$timeout = 5;
	curl_setopt($ch, CURLOPT_URL, $img_url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
	$img = curl_exec($ch);
	curl_close($ch);

	// 保存文件到制定路径
	file_put_contents($filename, $img);

	unset($img, $url);
	return true;
}

// 执行函数之后,会在当前文件的同一目录下生成下载好的图片
curlDownFile('http://mimg.127.net/logo/163logo.gif');

CURL上传文件

1.PHP5.5之前使用CURL上传文件

第一种写法,PHP版本要求 < 5.5
$filename 是文件路径,必须有
filename=test.txt 是接收方收到的文件名,为空时 则取 filename 文件路径中的 basename部分
type=text/plain 文档类型,可以为空

/**
 * @param string $target_url 上传目标地址
 * @param string $filename 上传文件路径
 * @param string $form_name 表单名称
 */
function curlUploadFile($target_url, $filename, $form_name) {
	$post_data = array(
		$form_name => "@$filename;filename=test.txt;type=text/plain",
	);
	
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $target_url);
    curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	
	$result = curl_exec($ch);
	curl_close($ch);
}

$target_url = 'http://www.codean.net/notFound/test.php';
$filename = realpath("C:/Users/HelloWorld/Desktop/Images/1.jpg");
$form_name = 'file';

// 接收端使用$_FILES接受
curlUploadFile($target_url, $filename, $form_name);

2.PHP5.5之后使用CURL上传文件

第二种写法(推荐),PHP版本 >= 5.5
filename 需要上传的文件,建议使用绝对路径
mimetype: 默认是 application/octet-stream,此处留空
postname: 接收方$_FILES数组中的文件名,默认为文件名

/**
 * @param string $target_url 上传目标地址
 * @param string $filename 上传文件路径
 * @param string $form_name 表单名称
 */
function curlUploadFile($target_url, $filename, $form_name) {
	$upload_file = new CURLFile($filename);
	$post_data = array(
        $form_name => $upload_file
	);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $target_url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $result = curl_exec($ch);
    curl_close($ch);
}

$target_url = 'http://www.codean.net/notFound/test.php';
$filename = realpath("C:/Users/HelloWorld/Desktop/Images/1.jpg");
$form_name = 'file';

// 接收端使用$_FILES接受
curlUploadFile($target_url, $filename, $form_name);

3.PHP发送文件流上传文件

/*
 * 第三种写法,使用PHP流发送
 * @param string $target_url 上传目标地址
 */
function curlUploadFile($target_url) {
	$fh = fopen('php://temp', 'rw+');
	$string = 'Hello World';
	fwrite($fh, $string);
	rewind($fh);

	$ch =  curl_init();
    curl_setopt($ch, CURLOPT_URL, $target_url);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
	curl_setopt($ch, CURLOPT_PUT, true);
    curl_setopt($ch, CURLOPT_INFILE, $fh);
    curl_setopt($ch, CURLOPT_INFILESIZE, strlen($string));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

	$result = curl_exec($ch);
	curl_close($ch);
}
$target_url = 'http://www.codean.net/notFound/test.php';
curlUploadFile($target_url);

// 接收端取出流文件并保存
$putdata = fopen('php://input', 'r');
$fp = fopen('test.txt', 'w');
while ($data = fread($putdata, 1024)) {
	fwrite($fp, $data);
}
fclose($fp);
fclose($putdata);

4.HTTP报文方式上传文件

/**
 * @param string $target_url 文件上传地址
 */
function curlUploadFile($target_url) {
	// 生成分隔符
	$delimiter = '-------------' . uniqid();
	// 需要上传的文件数组
	$fileFields = array(
		'file' => array(
			'name' => 'test.png',
			'type' => 'text/html',
			'content' => 'This is my file content.'
		),
	);
	// 后端接受的$_POST的数组值
	$postFields = array(
		'file' => 'file',
	);
	$data = '';

	// 先将post的普通数据生成主体字符串
	foreach ($postFields as $name => $content) {
		$data .= "--" . $delimiter . "\r\n";
		$data .= 'Content-Disposition: form-data; name="' . $name . '"';
		$data .= "\r\n\r\n" . $content . "\r\n";
	}
	// 将上传的文件生成主体字符串
	foreach ($fileFields as $name => $file) {
		$data .= "--" . $delimiter . "\r\n";
		$data .= 'Content-Disposition: form-data; name="' . $name . '"; filename="' . $file['name'] . "\" \r\n";
		$data .= 'Content-Type: ' . $file['type'] . "\r\n\r\n";
		$data .= $file['content'] . "\r\n";
	}
	// 主体结束的分隔符
	$data .= "--" . $delimiter . "--";

	// curl上传文件
	$handle = curl_init($target_url);
	curl_setopt($handle, CURLOPT_POST, true);
	curl_setopt($handle, CURLOPT_HTTPHEADER, array(
		'Content-Type: multipart/form-data; boundary=' . $delimiter,
		'Content-Length: ' . strlen($data))
	);
	curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
	$result = curl_exec($handle);
	curl_close($handle);
}
posted @ 2015-12-29 18:23  洋芋土豆  阅读(2390)  评论(0编辑  收藏  举报