【问题标题】:post multipart/form-data variable and image using curl使用 curl 发布 multipart/form-data 变量和图像
【发布时间】:2014-04-04 16:36:47
【问题描述】:

我的公司有一个 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);

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

我正在从谷歌学习一切,现在我被困住了,因为我没有任何深度编程知识,你能帮我把图像放在 $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

卷入 $data 数组?

【问题讨论】:

    标签: php image curl multipartform-data


    【解决方案1】:

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

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

    那么在你的帖子数据中,应该是:

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

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

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

    最后确保你的其他参数值是正确的。并且,还启用详细模式,这样你就可以看到 curl curl_setopt($ch, CURLOPT_VERBOSE, 1); 的输出

    【讨论】:

    • 我尝试了你的建议,“通常的数据”没有更新,图像仍然没有上传。我需要知道如何转换它: Content-Disposition: form-data;名称="你的文件"; filename="merc.jpg" Content-Type: image/jpeg $contentfile into $data array....
    • @n3m0 这些会自动添加。如前所述,运行启用详细模式的代码,然后检查自己发生了什么!
    • 我做了,图片还没上传……如果我用的是windows,我用的是“C:\path\filename.ext”,对吧?
    • @n3m0 \` requires instead of \ ` 你也可以使用c:/path/filename.ext
    【解决方案2】:

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

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

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

    再次感谢你们,你们让我更了解什么是 curl。

    问候,

    n3m0

    【讨论】:

      【解决方案3】:

      我最近遇到了类似的问题,我需要将文件上传到这个 API:

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

      通常可以直接上传,但有时有些服务器需要有关您发送的内容的更多信息。

      就我而言,它需要将ContentDisposition 标头Name 属性设置为"file",并将FileName 属性设置为要上传的文件的文件名。

      只要我添加了以下代码,一切都会完美运行:

      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 选项卡,看看它在做什么。
      • 通过比较我的代码和 Web 浏览器,我很快找出了问题所在

      只是猜测它似乎是在 Intranet 上,我们无法真正看一眼就知道出了什么问题。

      【讨论】:

      • 好吧,它是封闭源代码,所以我认为我不会有我公司的文档 :)。但我会尝试提琴手......非常感谢! :)
      • 如果您无法正确处理,请使用两个日志更新您的帖子,以便人们提供帮助。
      • 结果和我用“Tamper Data” add on for firefox bro 的结果一样,我需要改变这个 Content-Disposition: form-data; name="citizen_file"; filename="merc.jpg" Content-Type: image/jpeg into array of $data :(
      • 对不起,我的意思是 Content-Disposition: form-data;名称="你的文件"; filename="filename.jpg" 内容类型:image/jpeg
      猜你喜欢
      • 2018-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      • 2019-05-23
      • 2011-04-22
      • 1970-01-01
      相关资源
      最近更新 更多