使用PHP / cURL我登录网站并尝试上传文件。它返回错误消息“错误:文件上载未处理。请确保选择指定模板格式的适用Excel文件进行上传。”如果我从浏览器上传并给它一个格式错误的文件(如.jpg),则此错误与我收到的消息不同。
如果我通过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 :(得分:0)
&#34;请确保选择指定模板格式的适用Excel文件进行上传&#34;
可能与您的脚本无关。如果目标服务器说实话,那么您上传的文件不是指定的模板格式&#34;。
如果是,并且您完全确定它是,则错误消息不正确,唯一合理的操作是联系管理服务器的人。
答案 1 :(得分:0)
不是真正的解决方案,因为您的所有代码似乎都是正确的,但有一些关于如何在没有服务器管理员帮助的情况下进行故障排除的建议。
自己创建一个简单的上传脚本,并使用您的脚本将文件发布到您自己的服务器上。仔细检查您收到的文件是否与您发送的文件100%相等。
虽然您的内容类型是正确的,但请尝试使用application/octet-stream
或其他任何内容来查看是否有任何改变
如果你还没有,请尝试运行本地php服务器来运行你的curl脚本,以确保没有影响错误的IP检查。
由于JPG文件类型错误时收到不同的错误,请尝试使用脚本上传JPG,看看是否会收到相同的错误。如果你得到与excel文件相同的错误,最可能是服务器端的安全检查。
使用BURP suite之类的工具检查正在发送的实际标题/等,并尝试使用curl模仿它们。 Firebug可能也会起作用,但是当我被困住时,我个人更喜欢Burp:)
答案 2 :(得分:0)
由于您声明该脚本适用于您自己的网站,而且我没有看到代码中的任何错误,我的猜测可能是您没有发送足够的数据或正确的数据。
当我制作一个yahoo.com登录脚本时,我使用Tamper Data作为代理来查看浏览器发送到特定网页的所有数据,以查看是否有一些您没有发送的数据&#39不知道。
此外,我会尝试从浏览器中删除某些特定功能,例如Cookie或移除引用并上传,以准确了解错误/遗漏的原因导致错误:文件上传未处理。请确保选择指定模板格式的适用Excel文件进行上传。&#34;错误。
我通常使用HackBar(Firefox)删除引荐来源,Web Developer Toolbar禁用Cookie,Javascript,...
答案 3 :(得分: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;
?>