【发布时间】: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 的
<form... </form>。更新您的问题。 -
不确定是否重要,但我注意到您的表单“提交”大写,但在您的 curl 帖子中它是小写的
-
您首先必须保存文件,然后使用 cURL 发送:
$post = array( "file_box"=>"@/path/to/myfile.jpg", ); curl_setopt($ch, CURLOPT_POSTFIELDS, $post);