热搜:NVER node 开发 php

PHP使用CURL上传|下载文件

2024-07-26 22:35:02
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);}