我有一個在我的本地主機上運行的站點,但是切換到生產服務器引起了令人頭疼的問題。此時我無法真正更改服務器并嘗試處理它。
我正在嘗試從遠程服務器下載檔案。它使用 .net 回傳一個包含一堆檔案的 Zip 檔案:
$url = 'https://myremoteserver.com/getFiles?model=12345&Files=1,2,3,4';
如果我在瀏覽器中輸入 URL,檔案就會完美下載。但是外部無法訪問此服務器(我的筆記本電腦在 VPN 上時可以訪問)。
雖然從 SO 答案一起破解,但我的原始代碼看起來像這樣并且可以在我的本地主機上運行:
ob_start();
$filepath= $url; //your folder file path
header($_SERVER['SERVER_PROTOCOL'].' 200 OK');
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: Binary");
header("Content-Disposition:attachment;filename=".$filename);
while (ob_get_level())
{
ob_end_clean();
}
readfile($filepath);
exit;
在服務器上,我根本沒有得到任何回應。追逐那條尾巴,看起來安全性/SSL 正在阻止它作業。
我能夠讓這段代碼作業(但使用 CURLOPT_SSL_VERIFYHOST、false 和 CURLOP_SSL_VERIFYPEER、false),但它以字串形式回傳檔案(基本上是一堆亂碼 - 字串顯示亂碼中的一些檔案路徑資訊) .
標題顯示檔案名,現在我需要:
- 從標題中獲取檔案名
- 使用檔案名將檔案下載到客戶端。
- 所有檔案都是 .zip
PHP 檔案:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
//Need to figure out how to fix this too!
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
// Then, after your curl_exec call:
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);
var_dump($header);
echo('</br></br>');
//File Name:
echo($body);
回應:
string(409) "HTTP/1.1 200 OK Cache-Control: private Content-Type: application/zip Server: Microsoft-IIS/8.5 Access-Control-Allow-Origin: * Set-Cookie: ASP.NET_SessionId=rx1zv2ihyhui4eaqp2jkwtv1; path=/; HttpOnly; SameSite=Lax Content-Disposition: attachment; filename = 2012-08-16-MORE-FILE-NAME.zip X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Date: Thu, 10 Feb 2022 22:17:30 GMT Content-Length: 868 "
PK-/?JT?????????FolderName\FILE.txtL???n?0?Olbi??E?^?L[??M??f?]?Dm??H?yP)?!M?N??^ x?wA???m???o;?#'?O??縃?sX?x?}?6j?????! ?Z}[???????;:`?)???s????$o?k???w?of?e?ca#?-??3K??[??=@4?F??"?-4?????n??T??UGc??DC?bo???n1??U????%y??~?-?OmR??YZ??gn?A?#d?&u;??x??V?0?R?%?9????wny9V^~?B?f?????"Sm:)?)?j??eq????n?P????\@? ?3????-?u?~`?y?b??b??}?o??? ??68?<?s?m????;B?F,7?{%??!?}?]?%=?&???????[?s?U??n?m?;??`U??,??)?N? ?N???~o?-??Ywcay!]?A??#p0?NI6?W?7?&bt%v??v?8?O??6?n,ǘ~?/Kmt?q,W?? /L?hC#4?C?U??????D?mVK?"M?# k?Zrv??S?!???o???w2H:?G?a[?Hc????K???/??????v{R??\-?j???5???vvW????c}@b????)?????o?????~-??u???$v?b??L?j??"???B??#?K`?.??K?? ???PK3-/?JT???????????FolderName\FILE.txL?PKS?
那么如何讓 $body 更改為 ZIP 檔案(在 Content Disposition 中命名)以進行下載?
感謝您的幫助。
uj5u.com熱心網友回復:
據我了解,您希望您的 PHP 腳本將 zip 檔案作為下載檔案提供給客戶端。
因此,您要做的是設定一個標頭,讓客戶端知道它正在發送什么。
header("Content-Type: application/zip");
這應該會導致大多數瀏覽器下載該檔案,但這實際上取決于客戶端針對該 mime 型別擁有的處理程式。要成為肛門,您可以使用所有這些標題:
header("Content-Type: application/force-download");
header("Content-Type: application/download");
header("Content-Type: application/zip");
然后你可能想為下載指定一個檔案名,這樣它就不會以你的 php 腳本命名:
header("Content-Disposition: attachment;filename=".$file_name);
然后您可以從 CURL 請求中輸出正文。
echo($body);
你不想輸出任何其他東西,所以沒有 var_dump($header); 或回顯任何 html 標簽。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/427966.html
