2011-10-12 385 views
14

我正在製作一個html界面,通過拖動&拖放和多選文件在服務器上上傳圖片。我想在將圖片發送到服務器之前顯示圖片。所以我第一次嘗試使用FileReader,但我有一些問題,如this post。所以我改變了我的方式,我決定在帖子中使用blob:url像ebidel推薦,window.URL.createObjectURL()window.URL.revokeObjectURL()釋放內存。window.URL.revokeObjectURL()不立即釋放內存(或根本不釋放內存)?

但是現在我又遇到了另一個問題,就是類似於this one。如果他願意,我希望客戶可以上傳200張圖片。但瀏覽器崩潰,使用的RAM非常高!所以我認爲可能同時顯示了太多的圖像,並且我使用數組設置了一個帶有等待文件隊列的系統,以便只處理10個文件。但問題仍然存在。

在谷歌瀏覽器上,如果我檢查chrome://blob-internals/,文件(通常已由window.URL.revokeObjectURL()發佈)大約在8秒延遲後釋放。在Firefox上我不確定,但似乎如果這些文件沒有公佈(我檢查about:memory - >圖像)

是我的代碼是壞的,還是獨立於我的問題?有沒有解決辦法迫使導航員立即釋放內存?如果可以幫助,這是JavaScripton的一部分,但問題發生了:(對不起,但我給這裏一個鏈接,因爲新成員的圖像垃圾郵件機制)http://www26.zippyshare.com/v/14195278/file.html

編輯

這是一種自己的答案+答案來bennlich(太長了註釋文本)

我從user1835582的答案,我確實可以去掉理解Blob/File,但是當瀏覽器需要圖像時,它將它們保存在內存中(這是合乎邏輯的)。所以這是事實顯示圖像(許多&沉重),讓我崩潰&緩慢,而不是revokeObjectURL方法。而且,每個瀏覽器都以自己的方式管理內存,導致不同的行爲。這是我如何得出這個結論。

首先,讓我們嘗試使用https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications#Example.3A_Using_object_URLs_to_display_images的源代碼的簡單示例revokeObjectURL。 使用Chrome,您可以通過檢查chrome://blob-internals/或試圖將顯示的圖像打開到一個空白的新選項卡來驗證Blob是否已撤銷。注意:要完全發佈Blob參考,請添加document.getElementById("fileElem").value = ""。幾年前,當我發佈我的問題時,發佈blob大約需要8秒鐘,現在幾乎是立即的(可能是由於Chrome & /或更好的計算機的改進)

然後,進行充電測試的時間。我用每個〜2.5 Mo的jpg做了這個。在顯示圖像後,我滾動頁面。 Chrome崩潰並且Firefox很慢(未在其他瀏覽器上測試過)。然而,當我評論li.appendChild(img)一切順利,即使有一大堆圖像。這表明問題不是來自revokeObjectURL方法,實際上它可以正常工作,而是來自顯示大量繁重圖像。您還可以測試創建一個簡單的HTML頁面,其中包含數百個沉重的圖像並將其滾動=>相同的結果(崩潰/減速)。

最後,爲了深入瞭解圖像內存管理,Firefox有趣地研究了:內存。例如,我看到,當窗口處於活動狀態時,Firefox會解壓縮圖像(圖像 - >未壓縮 - 堆上升),而raw(圖像 - > raw)始終保持穩定(相對於加載的圖像數量)。關於內存管理有一個很好的討論:http://jeff.ecchi.ca/blog/2010/09/19/free-my-memory

+0

超級,我完全像你一樣有相同的問題 - 但5年後:)感謝您的努力,評論一切詳細。我會決定最好不要自動預覽所有圖片,只能根據需要。謝謝! –

回答

7

隨着window.URL.revokeObjectURL()你只能得到[斑點][文件]對象。你不能強制從內存中刪除。

注意。 瀏覽器尚未最終確定,它們可能會從這些設施泄漏。如果您實施動畫,則必須自行承擔風險。

+7

如果懂得這個答案的人會重寫它,那將是非常棒的。似乎很不清楚。 – bennlich

+0

@bennlich我編輯了我的問題,讓我對這個答案的理解+一些額外的細節。 – Seb

2

這不是一個答案,但我只想說,據我所知,這仍然是最新版本的Chrome(35)中的一個問題。我做了一個公開問題一個測試頁面:

http://ecobyte.com/tmp/chromecrash-1a.html

如果您選擇計算機上的高分辨率的照片大量的(比如,600),並將其拖放到頁面上的盒子,它會崩潰Chrome(在Windows 7和Mac OS X 10.8.5上試用)。

如果你看看源,你可以看到OPS的該序列是:

  1. createObjectURL
  2. 負載的IMG(!不添加到DOM)
  3. revokeObjectURL釋放裁判
  4. 失去IMG裁判
  5. 重複明年所有步驟下降圖像

似乎只有一個圖像應該在任何給定時刻在內存/引用中,但最終會導致Chrome崩潰。