你好!
我正在尝试自动将图像上传到站点,女巫正在使用数据库来跟踪文件。用户界面……嗯,很糟糕,而且我有很多文件。我无法访问数据库,所以我必须找到解决方法,我发现我可以使用cURL轻松模仿网站的上传机制。
我用 Mozilla 的 Firebug 检查了浏览器发送的 POST 数据,以及网站上传表单的源代码。我能够确定要发送到服务器的所需 POST 字段,因此我在 PHP 中放置了一个小 cURL 命令。
我正在使用 Debian GNU/Linux 和版本号为 5.3.20-1 的 PHP。相关代码如下所示:
$strfilepath = '@' . $item->getPathname(); // get next file from directory (directory iterator)
$postdata = array();
$postdata['upload'] = 1;
$postdata['category_id'] = 43;
$postdata['imgtoupload'] = $strfilepath;
$postdata['actie'] = 1;
curl_setopt($somecurl, CURLOPT_URL, "http://some.site.at.somwhere.com/image_up.php");
curl_setopt($somecurl, CURLOPT_POST, true);
curl_setopt($somecurl, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($somecurl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($somecurl, CURLOPT_NOPROGRESS, false);
curl_setopt($somecurl, CURLOPT_VERBOSE, true); // FTW!
$response = curl_exec($somecurl);
我想将浏览器的 POST 命令与我的“人工”http 请求进行比较,所以我的确切问题是如何获取 cURL 生成的 POST(或任何其他 HTTP)请求?(就像 Firebug 可以做的那样。)我对 curl 唯一能做的就是启用 CURLOPT_VERBOSE,但它只返回标题数据。
检查 curl_getinfo() 的返回和命令行列表,我发现服务器给出了 302 HTTP 警告,并且它没有上传任何文件:
Connection #0 to host some.site.at.somwhere.com left intact
身份验证可能存在一些问题,但我想确保代码为服务器发送适当的数据。
提前致谢!真诚的:G。
编辑(13.01.09):
哈!我成功了!问题是 cURL 以某种方式覆盖了发送数据的类型。它将图像标记为application/octet-stream
而不是image/jpeg
。我在“要发送的文件”字段中明确指定了类型,女巫解决了这个问题:
$strfilepath = '@' . $item->getPathname() . ";type=image/jpeg" ;
它可以正常工作。谢谢您的帮助!