2014-04-17 28 views
5

使用PHP/cURL我登录到网站并尝试上载文件。它会返回错误消息“错误:未处理文件上传,请确保选择指定模板格式的适用excel文件进​​行上载。”如果我从浏览器上传并为其提供了错误格式的文件(如.jpg),则此错误与我获得的消息不同。将PHP cURL文件上载到JSP脚本失败。通过浏览器上传的相同文件工作

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

那么我如何通过PHP/cURL这种方式使用Firefox的方式来完成这项工作?

我尝试了相同的上传到我自己的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); 
+0

好,你得到的是相当翔实的错误:'错误:文件上传不处理。请确保选择指定模板格式的适用excel文件进​​行上传。所以我认为JSP正在对上传的文件执行一组测试。你确定你发送的Excel文件实际上符合他们希望符合的任何模板吗? – fvu

+0

是的,我可以通过浏览器上传相同的文件,它可以工作。 – George

+0

从html显示'

'。更新你的问题。 –

回答

0

“请确保适用的精益求精,指定的模板格式文件选择上传”

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

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

+0

通过浏览器上传相同的文件会返回“上传成功”消息。还是)感谢你的建议。我会再次联系管理员。我还没有失去理智,但我很快就会遇到这个问题! – George

+0

啊是的。然后,至少你知道这是他们的问题,不是你的问题!祝你好运。 – Alex

+0

我仍然坚持这一点。网站所有者似乎没有任何技术人员可以提供帮助。如果我可以通过浏览器上传相同的文件,我应该可以通过cURL使其工作。 – George

0

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

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

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

  3. 如果你是不是已经尝试运行的本地PHP服务器来运行你的卷曲的脚本,以确保没有没有影响错误的IP检查。

  4. 由于您在JPG文件类型错误时收到不同的错误,请尝试上传带有脚本的JPG,以查看是否得到相同的错误。如果你得到与excel文件相同的错误,那么它最有可能在服务器端进行安全检查。

  5. 使用像BURP suite这样的工具来检查正在发送的实际标题/ etc并尝试用curl来模拟它们。 Firebug的可能藏汉工作,但我个人更喜欢打嗝时,我坚持:)

0

既然你指出脚本是为自己的网站运作良好,我没有看到代码我猜测任何错误这可能是你没有发送足够的数据或正确的数据。

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

此外,我会尝试从浏览器中删除一些特定的功能,如Cookie或删除引用程序和Tring上传,以确切地了解什么错误/丢失的事情导致“错误:文件上传未处理。选择指定模板格式的适用excel文件进​​行上传。“错误。

我通常使用HackBar(火狐),除去引荐和Web Developer Toolbar禁用cookies,JavaScript中,...

0
<?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; 
?>