簡體   English   中英

PHP cURL文件上傳到JSP腳本失敗。 通過瀏覽器上傳的同一文件

[英]PHP cURL file upload to JSP script fails. Same file uploaded via browser works

使用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 ); 

“請確保選擇指定模板格式的適用Excel文件進​​行上傳”

可能與你的腳本無關。 如果目標服務器說實話,那么您上傳的文件不是“指定的模板格式”。

如果是,並且您完全確定它是,則錯誤消息不正確,唯一合理的操作是聯系誰再次管理服務器。

不是真正的解決方案,因為您的所有代碼似乎都是正確的,但有一些關於如何在沒有服務器管理員幫助的情況下進行故障排除的建議。

  1. 自己創建一個簡單的上傳腳本,並使用您的腳本將文件發布到您自己的服務器。 仔細檢查您收到的文件是否與您發送的文件完全相同。

  2. 雖然您的內容類型是正確的,但請嘗試使用application/octet-stream或其他內容來查看是否有任何更改

  3. 如果您還沒有,請嘗試運行本地php服務器來運行curl腳本,以確保沒有影響錯誤的IP檢查。

  4. 由於JPG文件類型錯誤時會收到不同的錯誤,請嘗試使用腳本上傳JPG,看看是否收到相同的錯誤。 如果你得到與excel文件相同的錯誤,最可能是服務器端的安全檢查。

  5. 使用像BURP套件這樣的工具來檢查正在發送的實際標題/等,並嘗試用curl模仿它們。 Firebug可能也會起作用,但我個人更喜歡Burp,當我被困住的時候:)

由於您聲明該腳本適用於您自己的網站,並且我沒有在代碼中看到任何錯誤,我的猜測可能是您沒有發送足夠的數據或正確的數據。

當我制作yahoo.com登錄腳本時,我使用Tamper Data for Firefox作為代理,查看瀏覽器發送到特定網頁的所有數據,看看是否有一些你不知道的發送數據。

此外,我會嘗試從瀏覽器中刪除一些特定的功能,如cookie或刪除引用並上傳,以准確了解錯誤/遺漏的原因導致“錯誤:文件上傳未處理。請確保適用的Excel文件選擇指定的模板格式進行上傳。“ 錯誤。

我通常使用HackBar (Firefox)刪除引用者和Web開發人員工具欄來禁用Cookie,Javascript,...

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM