我想允許我的用戶通過提供圖像的URL來上傳文件。從PHP下載安全圖像
非常像imgur,您輸入http://something.com/image.png並且腳本下載文件,然後將其保存在服務器上併發布它。
我試過使用file_get_contents()
和getimagesize()
。但我認爲會出現問題:
- 如何保護100個用戶提供100個URL到大圖像的腳本?
- 我該如何確定下載過程將花費還是花費太長時間?
我想允許我的用戶通過提供圖像的URL來上傳文件。從PHP下載安全圖像
非常像imgur,您輸入http://something.com/image.png並且腳本下載文件,然後將其保存在服務器上併發布它。
我試過使用file_get_contents()
和getimagesize()
。但我認爲會出現問題:
這實際上很有趣。
您似乎可以實際跟蹤和控制傳輸的進度。見documentation上CURLOPT_NOPROGRESS
,CURLOPT_PROGRESSFUNCTION
和CURLOPT_WRITEFUNCTION
我發現this example,並把它改爲:
<?php
file_put_contents('progress.txt', '');
$target_file_name = 'targetfile.zip';
$target_file = fopen($target_file_name, 'w');
$ch = curl_init('http://localhost/so/testfile2.zip');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_NOPROGRESS, FALSE);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'progress_callback');
curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'write_callback');
curl_exec($ch);
if ($target_file) {
fclose($target_file);
}
$_download_size = 0;
function progress_callback($download_size, $downloaded_size, $upload_size, $uploaded_size) {
global $_download_size;
$_download_size = $download_size;
static $previous_progress = 0;
if ($download_size == 0) {
$progress = 0;
}
else {
$progress = round($downloaded_size * 100/$download_size);
}
if ($progress > $previous_progress) {
$previous_progress = $progress;
$fp = fopen('progress.txt', 'a');
fputs($fp, $progress .'% ('. $downloaded_size .'/'. $download_size .")\n");
fclose($fp);
}
}
function write_callback($ch, $data) {
global $target_file_name;
global $target_file;
global $_download_size;
if ($_download_size > 1000000) {
return '';
}
return fwrite($target_file, $data);
}
write_callback
檢查數據的大小是否超過規定的限值。如果是,它會返回一個空字符串來中止傳輸。我在兩個分別爲80K和33M的文件上測試了這個,限制爲1M。在你的情況下,progress_callback
在第二行之外沒有任何意義,但是爲了調試目的,我把所有內容都放在那裏。
獲取數據大小的另一種方法是執行HEAD
請求,但我認爲服務器不需要發送Content-length
標頭。
要回答問題一,您只需在代碼中添加適當的限制即可。定義在給定的時間內你想接受多少個請求,在數據庫中跟蹤你的請求,然後從那裏開始。還要在文件大小上設置一個上限。
對於問題二,您可以set appropriate timeouts if you use cURL。
你如何用file_get_contents限制文件大小? –
@ GRIGORE-TURBODISEL,你沒有。使用cURL。 – Brad
不,他們不是。但你的例子看起來完美無瑕。謝謝。 –
很高興我能幫到你。您應該將問題的標題更改爲更加連貫的內容,例如「在PHP中控制curl文件傳輸」,也可以爲「捲曲」添加標籤。 – Alexei