• 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 . "
    ";
    		$data .= 'Content-Disposition: form-data; name="' . $name . '"';
    		$data .= "
    
    " . $content . "
    ";
    	}
    	// 将上传的文件生成主体字符串
    	foreach ($fileFields as $name => $file) {
    		$data .= "--" . $delimiter . "
    ";
    		$data .= 'Content-Disposition: form-data; name="' . $name . '"; filename="' . $file['name'] . "" 
    ";
    		$data .= 'Content-Type: ' . $file['type'] . "
    
    ";
    		$data .= $file['content'] . "
    ";
    	}
    	// 主体结束的分隔符
    	$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);
    }
    
  • 相关阅读:
    vsftpd 配置:chroot_local_user与chroot_list_enable详解
    rsync同步目录
    apache
    centos 7 服务管理
    PowerPoint’s Menu is Too Big
    测试网页返回值
    作为人的展现方式
    Java 日期与时间
    Java 随机数
    Character 类
  • 原文地址:https://www.cnblogs.com/duanbiaowu/p/5086653.html
Copyright © 2020-2023  润新知