【发布时间】:2013-06-06 15:30:57
【问题描述】:
我有一个非常简单的 PHP 代码将文件上传到远程服务器;我这样做的方式(正如在其他一些解决方案中所建议的那样)是使用 cUrl 上传文件。
这是我的代码:
$ch = curl_init("http://www.remotesite.com/upload.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('fileupload' => '@'.$_FILES['Filedata']['tmp_name']));
echo curl_exec($ch);
服务器正在运行 PHP 5.5.0,并且似乎 @filename 在 PHP >= 5.5.0 中已弃用,如 CURLOPT_POSTFIELDS 描述下的 here 所述,因此,我收到此错误:
Deprecated: curl_setopt(): The usage of the @filename API for file uploading is deprecated. Please use the CURLFile class instead in ...
有趣的是,除了基本的类概述之外,php.net 上的这个类绝对没有任何内容。没有示例,没有方法或属性的描述。它基本上是空白的here。我知道这是一个全新的课程,几乎没有文档,也几乎没有实际使用,这就是为什么在 Google 或 Stackoverflow 上的搜索中几乎没有任何相关内容出现。
我想知道是否有人使用过这个 CURLFile 类并且可以帮助我或者给我一个例子来在我的代码中使用它来代替 @filename。
编辑:
我也想添加我的“upload.php”代码;此代码可以与传统的 @filename 方法一起使用,但不再与 CURLFile 类代码一起使用:
$folder = "try/";
$path = $folder . basename( $_FILES['file']['tmp_name']);
if(move_uploaded_file($_FILES['file']['tmp_name'], $path)) {
echo "The file ". basename( $_FILES['file']['tmp_name']). " has been uploaded";
}
最终编辑:
希望为寻找几乎没有文档记录的 CURLFile 类的类似工作示例的其他人添加最终/工作代码...
curl.php(本地服务器)
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label> <input type="file" name="Filedata" id="Filedata" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
<?php
if ($_POST['submit']) {
$uploadDir = "/uploads/";
$RealTitleID = $_FILES['Filedata']['name'];
$ch = curl_init("http://www.remotesite.com/upload.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$args['file'] = new CurlFile($_FILES['Filedata']['tmp_name'],'file/exgpd',$RealTitleID);
curl_setopt($ch, CURLOPT_POSTFIELDS, $args);
$result = curl_exec($ch);
}
?>
upload.php(远程服务器)
$folder = "try/";
$path = $folder . $_FILES['file']['name'];
if(move_uploaded_file($_FILES['file']['tmp_name'], $path)) {
echo "The file ". basename( $_FILES['file']['name']). " has been uploaded";
}
【问题讨论】:
-
你能 var_dump($_FILES) 吗?
-
在upload.php中?如果我这样做 - 我如何让它在我的 curl.php 页面上返回结果?我之前曾尝试这样做,但执行提交代码后实际上没有任何返回。
-
OK - 必须将 RETURNTRANSFER 设置为 true;所以这是 upload.php 下 var_dump($_FILES) 的结果:
array(1) { ["file"]=> array(5) { ["name"]=> string(11) "phpC0F4.tmp" ["type"]=> string(24) "application/octet-stream" ["tmp_name"]=> string(14) "/tmp/phpj7C3Hv" ["error"]=> int(0) ["size"]=> int(483397) } } The file phpj7C3Hv has been uploaded -
我 99% 都在工作 - 谢谢你。唯一缺少的是扩展。我需要做几件事 - 在 curl.php 中,我将代码更改为
$args['file'] = new CurlFile($_FILES['Filedata']['tmp_name'],'file/exgpd',$RealTitleID)以包含 mime 类型和 postname。在upload.php 中,我将代码更改为$path = $folder . $_FILES['file']['name']。此时文件正在上传到远程服务器;唯一的问题是它不保留扩展名,只保留文件名。我只需要弄清楚那部分。 -
thanks man wtf a simple curl image file uplading 我花了 1 个小时才弄清楚哦