【问题标题】:PHP cURL file upload to JSP script fails. Same file uploaded via browser worksPHP cURL 文件上传到 JSP 脚本失败。通过浏览器上传的相同文件有效
【发布时间】:2014-06-01 20:26:42
【问题描述】:

我使用 PHP/cURL 登录网站并尝试上传文件。它返回错误消息“错误:文件上传未处理。请确保选择了指定模板格式的适用excel文件进​​行上传。”此错误与我从浏览器上传并为其提供格式错误的文件(如 .jpg)时收到的消息不同。

如果我通过 Firefox 上传相同的 excel 文件,它可以工作并被服务器接受。

那么我怎样才能像使用 Firefox 一样通过 PHP/cURL 进行这项工作呢?

我尝试将相同的上传到我自己的 PHP 脚本,它也可以正常工作。我还在这里查看了一些相关问题并尝试了各种方法,但都没有任何区别。我尝试了使用和不使用 MIME 类型以及使用和不使用选项 CURLOPT_SSL_VERIFYPEER 和 CURLOPT_HTTPHEADER。

网站的所有者并不是特别有帮助,只是告诉我其他人正在这样做。

下面是我的代码:

$url = 'https://www.example.com/uploadController_u.jsp';

curl_setopt( $ch, CURLOPT_COOKIEJAR, $cookie_file );
curl_setopt( $ch, CURLOPT_COOKIEFILE, $cookie_file );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
curl_setopt( $ch, CURLOPT_MAXREDIRS, 10 );
curl_setopt( $ch, CURLOPT_FAILONERROR, true );
curl_setopt( $ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0");
curl_setopt( $ch, CURLOPT_REFERER, $curl_referer );
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_VERBOSE, true );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 ); // Added based on another StackOverflow question
curl_setopt( $ch, CURLOPT_HTTPHEADER, array('Expect:') ); // Added based on another StackOverflow question

// Tried with and without the MIME type
$post_vars = array( 
'file' => "@/home/someuser/private/eapis-test/mx/Template-test.xls;type=application/vnd.ms-excel",
'submit' => 'Upload file'  );

curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $post_vars );
$response = curl_exec( $ch );

下面是我发布的表格。我没有在 javascript 中找到对 form1 的任何引用。

<table border="0"  cellspacing="0" cellpadding="0">
    <form action="uploadController_u.jsp" method="post" enctype="multipart/form-data" name="form1" id="form1">
    <tr>
        <td align="left">
            <p>
                <h2>Upload Flight:</h2>
            </p>
        </td>
    </tr>
    <tr>
        <td>
            <b style="font-size: 90%;">To add a new flight from spreadsheet, </b>
        </td>
        <td align="left">
            <input name="file" type="file" id="file" align="left" size="36">
        <td>
    </tr>
    <tr>
        <td>
        </td>
        <td align="left">
            <p>
                <input type="submit" name="Submit" value="Upload file"/>
            </p>
        </td>
    </tr>
    </form>
</table>

我尝试了这些标头以更好地模拟浏览器,但无济于事:

$header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
$header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
$header[] = "Cache-Control: max-age=0";
$header[] = "Connection: keep-alive";
$header[] = "Keep-Alive: 300";
$header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$header[] = "Accept-Language: en-us,en;q=0.5";
$header[] = "Pragma: ";
curl_setopt( $ch, CURLOPT_HTTPHEADER, $header ); 

【问题讨论】:

  • 你得到的错误信息非常丰富:Error: File upload not processed. Please ensure that an applicable excel file in the specified template format is selected for upload.。所以我认为 JSP 正在对上传的文件执行一组测试。您确定您发送的 Excel 文件实际上符合他们希望它符合的任何模板吗?
  • 是的,我可以通过浏览器上传相同的文件,它可以工作。
  • 显示来自 html 的 &lt;form... &lt;/form&gt;。更新您的问题。
  • 不确定是否重要,但我注意到您的表单“提交”大写,但在您的 curl 帖子中它是小写的
  • 您首先必须保存文件,然后使用 cURL 发送:$post = array( "file_box"=&gt;"@/path/to/myfile.jpg", ); curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

标签: php jsp curl


【解决方案1】:

"请确保选择了指定模板格式的适用excel文件进​​行上传"

可能与您的脚本无关。如果目标服务器说的是真的,那么你上传的文件不是“指定的模板格式”。

如果是,并且您完全确定它是,那么错误消息是不正确的,唯一明智的做法是再次联系管理服务器的人。

【讨论】:

  • 通过浏览器上传相同的文件会返回“上传成功”消息。还是)感谢你的建议。我会再次联系管理员。我还没有失去理智,但我可能很快就会遇到这个问题!
  • 啊,是的。然后,至少您知道这是他们的问题,而不是您的问题!祝你好运。
  • 我仍然坚持这一点。网站所有者似乎没有足够的技术来提供帮助。如果我可以通过浏览器上传相同的文件,我应该可以通过 cURL 使其工作。
【解决方案2】:

这不是一个真正的解决方案,因为您的所有代码似乎都是正确的,但是一些关于如何在没有服务器管理员帮助的情况下进行故障排除的建议。

  1. 自己创建一个简单的上传脚本,并使用您的脚本将文件发布到您自己的服务器。仔细检查您收到的文件是否 100% 与您发送的文件相同。

  2. 虽然您的内容类型是正确的,但请尝试使用 application/octet-stream 或什么都不用,看看是否有任何改变

  3. 如果您还没有,请尝试运行本地 php 服务器来运行您的 curl 脚本,以确保没有影响错误的 IP 检查。

  4. 由于您在 JPG 文件类型错误时收到不同的错误,请尝试使用您的脚本上传 JPG 以查看您是否收到相同的错误。如果遇到与 Excel 文件相同的错误,则很可能是服务器端的安全检查。

  5. 使用BURP suite 之类的工具来检查正在发送的实际标头/等,并尝试使用 curl 模拟它们。 Firebug 可能也可以,但我个人更喜欢 Burp,当我遇到困难时 :)

【讨论】:

    【解决方案3】:

    由于您声明该脚本在您自己的网站上运行良好,并且我没有在代码中看到任何错误,我的猜测是您可能没有发送足够的数据或发送正确的数据。

    当我制作 yahoo.com 登录脚本时,我使用 Firefox 的 Tamper Data 作为代理来查看浏览器发送到特定网页的所有数据,看看是否有一些你不知道的发送数据.

    此外,我会尝试从浏览器中删除一些特定功能,例如 cookie 或删除引荐来源网址并尝试上传,以准确了解是什么错误/缺失导致“错误:文件上传未处理。请确保选择指定模板格式的适用excel文件进​​行上传。”错误。

    我通常使用HackBar (Firefox) 来删除引荐来源网址,并使用Web Developer Toolbar 来禁用 Cookie、Javascript...

    【讨论】:

      【解决方案4】:
      <?php
          $target_url = 'http://127.0.0.1/file.php';
              $file_name_with_full_path = realpath('./sample.jpeg');
              $post = array('extra' => '123456','file'=>'@'.$file_name_with_full_path);
              $ch = curl_init();
              curl_setopt($ch, CURLOPT_URL,$target_url);
              curl_setopt($ch, CURLOPT_POST,1);
              curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
              curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
              $result=curl_exec ($ch);
              curl_close ($ch);
              echo $result;
      ?>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-09
        • 2020-01-20
        • 1970-01-01
        • 2016-02-22
        • 2017-10-25
        • 2016-03-19
        • 1970-01-01
        相关资源
        最近更新 更多