我正在尝试将图片上传自动化到网站,女巫正在使用数据库来跟踪文件。用户界面......好吧,非常糟糕,而且我有很多文件。我无法访问数据库,因此我必须找到解决方法,我发现我可以使用 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命令与我的“artifical”http请求进行比较,所以 我的确切问题是如何获取由cURL生成的POST(或任何其他HTTP)请求?(就像Firebug可以做的那样。) 我唯一能做的就是启用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" ;
它可以正常工作。谢谢你的帮助!
答案 0 :(得分:0)
最简单的方法是从命令行使用ngrep
:
ngrep -W byline host some.site.at.somwhere.com and port 80
将把端口80上some.site.at.somwhere.com
的所有流量转储到stdout。您还可以使用-O
标志将输出写入pcap文件:
ngrep -O http-traffic.pcap -W byline host some.site.at.somwhere.com and port 80
某些发行版不会在其主存储库中打包ngrep
,但tcpdump
在这种情况下是一个不错的选择,语法类似:
tcpdump -A -s 1600 host some.site.at.somwhere.com and port 80
并将其发送到文件,而不是:
tcpdump -w http-traffic.pcap -s 1600 host some.site.at.somwhere.com and port 80
请注意,无论您使用哪种工具,表达式host some.site.at.somwhere.com and port 80
都是相同的。您可以使用man pcap-filter
了解相关信息。