2011-10-26 29 views
1

我搜索了類似的請求/問題,但似乎沒有任何符合我的情況。使用PHP讀取文件的零星碎片圖像

我使用PHP文件將上傳的文件發送/輸出到瀏覽器。我將PHP文件稱爲「閱讀器」文件。以下是讀者的歸結版本(爲了簡明,刪除其它文件類型):

<?php 
    if($_GET['upload']){ // for files uploaded via CMS uploader 
     $file = $site_directory . $uploads_path . $_GET['upload']; 
    } 
    if (file_exists($file)) { 
     header('Content-Description: File Transfer'); 
     // JPG 
     if(strstr($file,".jpg")) 
     { 
      header('Content-type: image/jpeg'); 
      header('Content-Disposition: inline; filename='.basename($file)); 
     // OTHER FILE TYPES 
     }else 
     { 
      header('Content-Type: application/octet-stream'); 
      header('Content-Disposition: attachment; filename='.basename($file)); 
     } 
     header('Content-Transfer-Encoding: binary'); 
     header('Expires: 0'); 
     header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
     header('Pragma: public'); 
     header('Content-Length: ' . filesize($file)); 
     ob_clean(); 
     flush(); 
     readfile($file); 
     exit; 
    }else{ 
     echo "<p>That file does not exist.</p>"; 
    } 
?> 

正如您將在下面的例子中看到,一般的作品。但是,當瀏覽器必須以這種方式加載多張圖片時,有些圖片不會加載/顯示爲已損壞。你可以在這裏看到它的一個例子:http://www.technotarek.com/index.php?id=25&view=grid。如果您一開始沒有在照片網格中看到任何損壞的圖像,請嘗試幾次硬刷新。

任何想法爲什麼這是不可靠的多個文件/圖像?

請注意,我有一個額外的腳本來重新調整示例中的圖像大小,但這不是罪魁禍首。我刪除它,問題依然存在。

更多背景(爲什麼我使用這種方法):我最初開始在服務器管理員不允許上傳到網絡服務器的網站上使用讀者腳本/文件,而是要求存儲所有用戶上傳內容在一個單獨的沙地服務器上。 「reader」文件允許我訪問和輸出這些文件,因爲sandlot文件的直接URL是不可能的。

+0

如果您並行加載多個映像,那麼可能會用完允許的進程或內存(無論如何共享主機)。但這很難說明確。嘗試從命令行運行併發curl請求以進行調試。 – mario

+0

是的,這是坐在共享主機平臺上。可能你知道幫助管理腳本中的流程/內存嗎?和/或者,你能否提供更多關於捲曲調試建議的指導?非常感謝。 – technoTarek

+0

請注意,您的腳本將愉快地提供服務器上的任何文件。 'HTTP://example.com/script.php上傳= ../../../../../../../../seekrit.passwords'?希望你沒有任何你想保密的東西。 –

回答

0

如果間接下載腳本只是用來添加標題,然後investiage如果你可以使用:

爲了減少腳本負荷,readfile的替代方案是:mod_xsendfileX-Sendfile:標題,所以Apache進程處理讀取/發送。 (如果通過網絡文件系統以某種方式映射文件,應該是可能的。)

+0

完整的腳本會多一點。它首先檢測沙坑是否在使用中(通過站點配置設置)。然後它會根據該配置動態構建文件路徑,然後沿着該文件發送。因此,我認爲劇本是必要的。此外,這是在Apache和IIS服務器上運行的,所以聽起來我必須用X-Sendfile方法基於平臺編寫兩個不同版本。我將繼續研究進程/內存管理......任何其他在這方面的線索都會很感激。 – technoTarek