使用curl发布multipart / form-data变量和图像

时间:2014-04-04 16:36:48

标签: php image curl multipartform-data

我的公司有一个html表单来发送变量和更新图像(jpeg)到服务器,我试图使用curl自动化它,但卡住了。我可以发送变量而不是图像。

我使用了“篡改数据”firefox并注意到我的表单将以下变量发送到服务器:

-----------------------------291231848620019\r\nContent-Disposition: form-data; name="pin"\r\n\r\ndf8794b1ec63c7094f6498f7a1322bcc\r\n-----------------------------291231848620019\r\nContent-Disposition: form-data; name="yourdata"\r\n\r\nonly test\r\n-----------------------------291231848620019\r\nContent-Disposition: form-data; name="your_file"; filename="chansy.jpg"\r\nContent-Type: image/jpeg\r\n\r\n{content-of-image-file-here}\r\n-----------------------------291231848620019\r\nContent-Disposition: form-data; name="birth_date[]"\r\n\r\n1\r\n-----------------------------291231848620019\r\nContent-Disposition: form-data; name="birth_date[]"\r\n\r\n1\r\n-----------------------------291231848620019\r\nContent-Disposition: form-data; name="birth_date[]"\r\n\r\n1970\r\n-----------------------------291231848620019\r\nContent-Disposition: form-data; name="your_email"\r\n\r\nkrunker@asia.com\r\n-----------------------------291231848620019\r\nContent-Disposition: form-data; name="code"\r\n\r\n\r\n-----------------------------291231848620019\r\nContent-Disposition: form-data; name="pass"\r\n\r\npass_sample\r\n-----------------------------291231848620019\r\nContent-Disposition: form-data; name="act"\r\n\r\nUpdate Changes\r\n-----------------------------291231848620019\r\nContent-Disposition: form-data; name="your_name"\r\n\r\njust me\r\n-----------------------------291231848620019--\r\n

这是我在阵列postfields上使用的代码:

$img=file_get_contents($filename);    
$data = array('pin' => $pin, 'yourdata' => $_POST['yourdata'], 'your_file'=>$img, 'filename' =>$filename, 'Content-Type' => 'image/jpeg', 'birth_date[]' => $_POST['birth_date'], 'birth_date[]' => $_POST['birth_month'], 'birth_date[]' => $_POST['birth_year'], 'your_email' => $_POST['your_email'], 'pass' => $_POST['pass'], 'act' => 'Update changes', 'your_name' => $_POST['your_name']);
$ch = curl_init();
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch , CURL_HTTPHEADER , "Content-Type: multipart/form-data" );
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_REFERER, "http://internalweb.com/");
curl_setopt($ch, CURLOPT_URL, "http://internalweb.com/profile");
$page = curl_exec($ch);

在结果上,当我运行我的脚本时,它可以更新这些变量,但是图像没有运气..我很困惑......我该怎么做才能放入变量?

我正在学习Google的所有内容,现在我被困了,因为我对深度编程没有任何了解,你能帮我解决一下将图像放入$ data数组吗?

我试图查看以下主题: multipart/form-data into array not processing multipart/form-data php curl Posting raw image data as multipart/form-data in curl

注意: 我试图遵循哈桑的建议,但仍然没有工作。有谁知道如何转换这个:

Content-Disposition: form-data; name="your_file"; filename="merc.jpg"
Content-Type: image/jpeg
$contentfile

进入curl的$ data数组?

3 个答案:

答案 0 :(得分:2)

使用curl将文件上传到服务器时,需要在文件路径前指定@符号。例如,此图像文件:

$img = '/var/tmp/someimg.jpg';  // must be full path

然后在你的帖子数据中,它应该是:

'your_file' => '@' . $img,

另外,从curl代码中删除以下标题。 Curl会根据您的参数自动设置此标题的长度。

curl_setopt($ch , CURL_HTTPHEADER , "Content-Type: multipart/form-data" );

最后确保您的其他参数值正确无误。并且,还启用详细模式,以便您可以看到curl curl_setopt($ch, CURLOPT_VERBOSE, 1);

的输出

答案 1 :(得分:0)

我最近有类似的问题,我需要将文件上传到此API:

http://www.sonicapi.com/docs/api/file-upload

通常情况下,上传很简单,但有时会有服务器需要有关您发送内容的更多信息。

在我的情况下,它需要将ContentDisposition标头Name属性设置为"file",并将FileName属性设置为要上载的文件的文件名。 / p>

只要我添加了以下代码,一切都运行良好:

string name = Path.GetFileName(fileName);
streamContent.Headers.ContentDisposition = 
    new ContentDispositionHeaderValue("form-data")
{
    Name = "\"file\"",
    FileName = String.Format("\"{0}\"", name)
};
streamContent.Headers.ContentType = 
    new MediaTypeHeaderValue("application/octet-stream");

现在你的问题肯定不一样了

您可以获取有关该服务的文档,或尝试以下操作:

以下是我如何解决问题的方法。

  • 我在后台运行Fiddler,同时手动发布表单(来自网络浏览器)。
  • 我看了 Inspectors 中的 Raw 标签,看看它在做什么。
  • 通过比较我的代码和网络浏览器,我很快发现了什么错误

只是猜测它似乎在内联网上,我们无法真正了解它是什么错误。

答案 2 :(得分:0)

好的,我会关闭这个问题,非常感谢你的帮助!真的很感激它:)

我试图在我自己的服务器上模拟它,似乎我可以使用curl成功上传文件 *信用到hassan :) *

但不知道我的制作网站/我公司的网站是如何收到我通过curl发送的图片文件的。由于目的地的源代码是封闭源代码,所以除了继续尝试,如果我有新的东西出现,我不能做太多的事情。

所以再一次,谢谢你,你们让我更了解什么是卷曲。

此致

n3m0