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);
}

转载于:https://www.cnblogs.com/duanbiaowu/p/5086653.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值