2012-09-04 53 views
1

我想允許我的用戶通過提供圖像的URL來上傳文件。從PHP下載安全圖像

非常像imgur,您輸入http://something.com/image.png並且腳本下載文件,然後將其保存在服務器上併發布它。

我試過使用file_get_contents()getimagesize()。但我認爲會出現問題:

  1. 如何保護100個用戶提供100個URL到大圖像的腳本?
  2. 我該如何確定下載過程將花費還是花費太長時間?

回答

1

這實際上很有趣。

您似乎可以實際跟蹤和控制傳輸的進度。見documentationCURLOPT_NOPROGRESSCURLOPT_PROGRESSFUNCTIONCURLOPT_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標頭。

+0

不,他們不是。但你的例子看起來完美無瑕。謝謝。 –

+0

很高興我能幫到你。您應該將問題的標題更改爲更加連貫的內容,例如「在PHP中控制curl文件傳輸」,也可以爲「捲曲」添加標籤。 – Alexei

0

要回答問題一,您只需在代碼中添加適當的限制即可。定義在給定的時間內你想接受多少個請求,在數據庫中跟蹤你的請求,然後從那裏開始。還要在文件大小上設置一個上限。

對於問題二,您可以set appropriate timeouts if you use cURL

+0

你如何用file_get_contents限制文件大小? –

+0

@ GRIGORE-TURBODISEL,你沒有。使用cURL。 – Brad