簡體   English   中英

取消HTTP POST請求服務器端

[英]Cancel an HTTP POST request server side

我正在嘗試編寫用於上傳大文件(> 500MB)的腳本。 我想在處理上傳之前做一些身份驗證,例如:

$id = $_GET['key'];
$size = $_GET['size'];
$time = $_GET['time'];
$signature = $_GET['signature'];

$secret = 'asdfgh123456';

if(sha1($id.$size.$time.$secret) != $signature){
echo 'invalid signature';
exit;
}
process upload...

遺憾的是,php只在文件上傳到臨時目錄后運行此代碼,占用了寶貴的服務器資源。 有沒有辦法在上傳之前執行此操作? 我用perl / cgi嘗試了類似的東西,但同樣的事情發生了。

哇,已經有5個答案告訴我們怎么做不到。 mod_perl到救援 ,在這里你可以在整個請求正文上傳之前拒絕一個請求。

Apache甚至在調用PHP腳本之前負責上傳,因此您將無法獲得它。

您可以將流程拆分為兩個頁面(身份驗證,文件上載頁面),或者,如果您需要在一個頁面中完成所有操作,請在檢查身份驗證參數后使用AJAX-esque解決方案上載文件。

據我所知,你不能用PHP做到這一點。 啟動PHP腳本以響應請求,但是在上載文件之前不會“發送”請求,因為正在上載的文件是請求的一部分。

在您上傳到的PHP腳本中,這絕對不可能。

最簡單的可能性是在上傳發生之前提供一步驗證。

如果這不是一個選項,那么可以想到一個稍微有點古怪的可能性 - 使用RewriteMap並將其映射到外部程序(應該可以使該程序成為PHP腳本)。

使用RewriteMap可以根據命令行程序的輸出重寫URL。 如果您使用此指令調用(單獨的)PHP腳本 - 您將無法使用用戶的會話! - 在處理請求之前,您可以訪問GET參數。

如果處理失敗(=憑據無效),您可以將請求重定向到靜態資源,這至少會阻止PHP啟動。 (我認為上傳的內容無論如何都會占用一些資源,但可能會少於重定向到PHP。)

不能保證這是否有效! 我沒有RewriteMap的經驗。

這是因為每個HTTP請求都是單個包含所有表單/ POST數據的事實,包括文件上載數據。

因此,我不相信以這種方式處理文件上載請求,無論您使用哪種腳本語言。

我認為你不能做到這一點。 您可以做的最好的事情是在onSubmit上運行一個AJAX函數來進行驗證,然后如果它返回有效,則執行POST以上傳文件。 如果身份驗證有效,您可以在AJAX腳本中設置$_SESSION ,然后在上載腳本中檢查該會話var以允許上載。

暫無
暫無

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

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