2011-02-27 27 views
7

Tôi đang tìm cách gửi dữ liệu từ máy chủ ở định dạng nén tới ứng dụng khách (với yêu cầu ajax) và giải nén dữ liệu đó bằng trình duyệt? Có thư viện nào không?Có thư viện nào để nén trong Javascript

Tôi không tìm kiếm tệp nén javascript!

Thanks ...

EDIT: Tôi nghĩ rằng câu hỏi là không đủ rõ ràng, tôi không muốn để nén file html, tôi muốn lưu trữ một số file LZMA nén hoặc bất kỳ định dạng nén khác trên máy chủ (như một tập tin obj), và sau đó tôi cần phải giải nén chúng sau khi tôi đã nhận nó với AJAX. Không nén/giải nén đồng thời với gzip. Mở các tệp zipeed sau khi nhận chúng bằng Javascript.

+0

Đối với tài nguyên tĩnh, máy chủ được định cấu hình đúng sẽ nén cho bạn và trình duyệt sẽ tự động giải nén. Đối với những người năng động như bạn muốn truy vấn, nó phức tạp hơn nhưng có thể là tốt. Bạn sử dụng ngôn ngữ phía máy chủ nào? –

+0

Xin lưu ý rằng HTTP/1.1 đã hỗ trợ ba định dạng nén khác nhau ('gzip', 'deflate' và 'compress'). –

+0

@gkaytck: Có bất kỳ điều gì http://stackoverflow.com/questions/2349210/how-to-compress-data-on-asp-net-and-uncompress-in-javascript trợ giúp không? – wilbbe01

Trả lời

6

Máy chủ web của bạn (và trình duyệt) phải có khả năng xử lý minh bạch bằng gzip này. Cách thiết lập này sẽ phụ thuộc vào máy chủ bạn đang sử dụng.

Thanh toán mod_deflate trong apache hoặc bật gzip trong nginx.

Trình duyệt sẽ tự động giải nén dữ liệu trước khi nó đến trình xử lý XHR của bạn và bạn có thể an toàn khi biết rằng dữ liệu của bạn đã được nén càng nhiều càng tốt khi chuyển tiếp.

+0

Điều này không thực sự áp dụng cho các phản hồi động. Thủ thuật bổ sung thường là cần thiết để nén chúng. –

+1

Bạn không chắc chắn điều gì khiến bạn nghĩ vậy? Trừ khi bạn đang xử lý một số loại ứng dụng truyền trực tuyến.Cả hai apache và nginx sẽ vui vẻ gzip lên một phản ứng năng động trước khi trở về nó chỉ đơn giản bằng cách thêm các dòng có liên quan để cho phép nén. –

0

này sẽ hứa hẹn: http://code.google.com/p/jslzjb/

+3

-1, thư viện đó bị hỏng, nó trả về "byte" lớn hơn 255. – aaaaaaaaaaaa

+0

Hoạt động tốt cho tôi và các giải pháp phát triển (dựa trên nút) khác đã được chuyển gần như nguyên văn từ mã đó, mà không đề cập đến vấn đề. – Orwellophile

0

gì Erik nói, http://code.google.com/p/jslzjb/

Dưới đây là một số mã cơ bản để giúp bạn đi, và giải mã.

var stringStreamIn = function(s) { 
    this.data = s; 
    this.length = this.data.length; 
    this.offset = -1; 
    this.readByte = function(){ 
     if (++this.offset >= this.length) { 
      return null; 
     } 
     return this.data.charCodeAt(this.offset); 
    }; 
}; 

var stringStreamOut = function() { 
    this.data = ''; 
    this.length = function() { return this.data.length; }; 
    this.writeByte = function(value) { 
     this.data += String.fromCharCode(value); 
    }; 
}; 

var so = new stringStreamOut(); 
var si = new stringStreamIn(atob("XQAAgAD//////////wAnG8AHA8+NCpYMj8Bgfez6bsJh4zoZx3fA+gih10oOa6rwYfkaucJIKX8T69I5iOe8WJwg/Ta7x3eHeDomxR6Vf824NLmKSrWHKdnM9n0D2aipzLbHv5//sTGAAA==")); 
LZMA.decompressFile(si, so); 
console.log(so.data); 
3

tôi biết, đây là một câu trả lời rất muộn, nhưng tôi thấy điều này một sự thay thế thú vị: http://pieroxy.net/blog/pages/lz-string/index.html Nó cũng có triển khai bằng các ngôn ngữ khác!

Và yêu thích của tôi ngay bây giờ là pako. Nó thực sự rất nhanh và dễ sử dụng và tương thích với zlib

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