2016-02-02 14 views
5

Vì vậy, vì một số lý do tôi cần phải POST hình ảnh được mã hóa base64 trong một đầu vào bằng cách sử dụng MẪU. Kích thước của hình ảnh ~ 1,1MB, kích thước 2500x1700. Kích thước được mã hóa Base64 ~ 1,5MB.Rò rỉ bộ nhớ Chrome với POST có hình ảnh được mã hóa base64 trong đầu vào - cách giải quyết?

Vì vậy, tôi có hai yếu tố đầu vào trong biểu mẫu: tệp đầu vào và đầu vào bị ẩn. Sau khi tải xuống một hình ảnh để nhập ẩn (sử dụng FileReader để chuyển đổi hình ảnh thành base64), tôi xóa giá trị tệp đầu vào, vì vậy, không có tệp phụ.

Khi tôi cố gắng gửi trang biểu mẫu bị đóng băng và mức tiêu thụ bộ nhớ tăng từ 50% lên 93% (RAM 4Gb) và sau đó Chrome gặp sự cố.

Khi tôi cố gắng chạy trang này trong Firefox (luôn chậm và lag) Tôi đã có bài đăng ngay lập tức mà không cần tiêu thụ bộ nhớ bổ sung.

Tất nhiên, tôi sẽ đăng vấn đề này lên Chrome nhưng giờ tôi cần biết: có thủ thuật nào để tránh không? Vâng, có lẽ tôi không phải là người đầu tiên tìm thấy lỗi này.


Ok, do đó, nếu sử dụng input.value = e.target.result trong sự kiện onload FileReader, tôi có được rò rỉ bộ nhớ. Nếu tôi đặt văn bản tùy chỉnh độ dài bằng nhau thành input.value, không có vấn đề gì. Vì vậy, tôi không nghĩ rằng e.target.result có thể lưu tham chiếu đến FileReader (hoặc nó có thể?), Bởi vì nó là chuỗi. Vì vậy, chúng tôi có vấn đề gốc chrome khi nhận được kết quả FileReader.


input.addEventListener("change", function() { 
    var reader = new FileReader(); 
    reader.onload = function(e) { 
    document.getElementById("input_hidden").value = e.target.result; 
    }; 
    reader.readAsDataURL(this.files[0]); 
}); 
+0

Bạn đang làm một bài đăng biểu mẫu thông thường hoặc sử dụng một số yêu cầu ajax? Dù bằng cách nào cho thấy mã của bạn. Và tại sao gửi base64 khi bạn có thể gửi tập tin? –

+0

Mã quá lớn. Đó là hình thức thường xuyên đăng bài. Vì tôi đang sử dụng nhiều tệp đầu vào, điều đó có nghĩa là người dùng có thể chọn vài tệp. Nhưng tôi cần phải cung cấp cho người dùng khả năng hủy một số hình ảnh trước khi gửi. Tôi không thể thao tác đầu vào [type = file] .files vì ​​nó chỉ đọc – user64675

+0

Mã "có thể quá lớn" nhưng nếu bạn không thể tái tạo điều này trong một ví dụ đơn giản, chúng tôi không thể làm gì để giúp bạn bên cạnh phỏng đoán. –

Trả lời

0

Hãy thử sử dụng một vô hình <textarea> thay vì input hidden.

Nó sẽ giống như sau:

<textarea style="display:none" id="XXX"> 
$("XXX").value = base64 

Ngoài ra hãy chắc chắn để loại bỏ các input file hoàn toàn, giữ nó bên ngoài của các thẻ hình thức sau đó loại bỏ nó từ DOM.

Hy vọng điều này sẽ giúp

+0

Thật không may, không – user64675

Các vấn đề liên quan