2011-11-03 23 views
21

Tôi có rất nhiều hình ảnh trong một thư mục được sử dụng trong ứng dụng. Khi sử dụng cache manifest nó sẽ được bảo trì dễ dàng hơn nếu tôi có thể chỉ định một thẻ hoang dã để tải tất cả các hình ảnh hoặc tập tin trong một thư mục nhất định để được lưu trữ.Tôi làm cách nào để chỉ định ký tự đại diện trong tệp kê khai bộ nhớ cache HTML5 để tải tất cả hình ảnh trong một thư mục?

Ví dụ:

CACHE MANIFEST 
# 2011-11-3-v0.1.8 
#-------------------------------- 
# Pages 
#-------------------------------- 
../index.html 
../edit.html 
#-------------------------------- 
# JavaScript 
#-------------------------------- 
../js/jquery.js 
../js/main.js 
#-------------------------------- 
# Images 
#-------------------------------- 
../img/*.png 

Việc này có thể thực hiện được không? Đã thử nó trong một vài trình duyệt với ../img/* là tốt nhưng nó dường như không hoạt động.

+0

** LƯU Ý: ** vào năm 2017 API [Công nhân dịch vụ] (https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers) đang nhanh chóng thay thế AppCache và trình duyệt đang bắt đầu bỏ qua tệp '.manifest' - Firefox 44 thậm chí còn đề xuất sử dụng công nhân Dịch vụ thay vì trong bảng điều khiển khi tìm thấy tệp' .manifest'. –

Trả lời

17

Tôi không nghĩ rằng nó hoạt động theo cách đó. Bạn sẽ phải chỉ định tất cả các hình ảnh một, hoặc có một kịch bản lệnh PHP đơn giản để lặp qua thư mục và xuất tệp (với đúng tiêu đề text/cache-manifest tất nhiên).

+19

Thực ra, một ký tự đại diện hoạt động ** nếu ** bạn cho phép danh sách thư mục, tức là nếu bạn duyệt đến ... mysite.com/img/ và bạn sẽ nhận được danh sách tất cả các tệp trong thư mục. Tôi đã dành hầu hết buổi chiều cố gắng tìm ra lý do tại sao trang web này hoạt động trên máy phát triển của tôi (cho phép danh sách thư mục) nhưng không có trên máy chủ thử nghiệm của tôi (không cho phép danh sách). Tuy nhiên, vì lý do bảo mật, hầu hết các máy chủ đều vô hiệu hóa danh sách thư mục .... – JvO

+1

@JvO: Thú vị! Tôi không biết. Bạn có thể chỉnh sửa câu trả lời của tôi để bao gồm câu trả lời đó không? Tôi sẽ chấp nhận chỉnh sửa được đề xuất của bạn (bạn cũng sẽ nhận được một vài điểm từ nó: P) –

21

Sẽ dễ dàng hơn, nhưng nó sẽ hoạt động như thế nào? Tệp kê khai là tệp được phân tích cú pháp và hoạt động trong trình duyệt, không có kiến ​​thức đặc biệt về tệp trên máy chủ của bạn ngoài những gì bạn đã nói. Nếu trình duyệt nhìn thấy điều này:

../img/*.png 

Trình duyệt đầu tiên nên yêu cầu hình ảnh nào từ máy chủ? Hãy bắt đầu với những điều sau:

../img/1.png 
../img/2.png 
../img/3.png 
../img/4.png 
... 
../img/2147483647.png 

Đó là tất cả hình ảnh có thể tồn tại với tên số, dừng bán tùy ý tại 231-1. Có bao nhiêu trong số 2 tỷ tệp đó tồn tại trong thư mục img của bạn? Bạn có thực sự muốn một trình duyệt thực hiện tất cả các yêu cầu đó chỉ để nhận được 2 tỷ 404 không? Cho đầy đủ các trình duyệt có lẽ cũng muốn yêu cầu tất cả các khoản tương đương zero-điền:

../img/01.png 
../img/02.png 
../img/03.png 
../img/04.png 
... 
../img/001.png 
../img/002.png 
../img/003.png 
../img/004.png 
... 
../img/0001.png 
../img/0002.png 
../img/0003.png 
../img/0004.png 
... 

Bây giờ thực hiện hơn 4 tỷ yêu cầu HTTP của trình duyệt cho các tập tin mà chủ yếu là không có, và đó là chưa thậm chí còn trên vào các chữ cái hoặc dấu chấm câu trong việc xây dựng các tên tệp có thể tồn tại trên máy chủ. Đây không phải là cách khả thi để tệp kê khai hoạt động. Máy chủ là nơi các tập tin trong thư mục img được biết, do đó, nó trên máy chủ mà danh sách các tập tin đã được xây dựng.

+1

Khi trình duyệt thực hiện yêu cầu ban đầu đối với máy chủ, nó chỉ nhìn vào thư mục ảnh công khai và danh sách thư mục trên đó danh mục. Điều đó sẽ trả về một danh sách các tập tin mà nó có thể nhìn thấy. Sau đó, nó tải xuống trình duyệt/máy khách chỉ các tệp có phần mở rộng .png. Không cần phải đoán những gì các tập tin có thể được gọi bằng cách truy vấn máy chủ từ 0 - một nghìn tỷ tên tập tin khả năng. – zuallauz

+1

@zuallauz Giả sử thư mục hình ảnh được cung cấp công khai, điều đó không thực sự nói gì khác với những gì tôi nói: "Máy chủ là nơi các tệp trong thư mục img được biết đến, vì vậy trên máy chủ danh sách các tệp phải được xây dựng ", ngoại trừ việc không có định dạng chuẩn cho danh sách tệp được trả về bởi một thư mục ảnh công khai có sẵn để trình duyệt phân tích cú pháp, nhưng có một tiêu chuẩn cho tệp kê khai. – robertc

+7

Nếu không có danh sách thư mục/thư mục, bạn có thể nói "cache bất kỳ tệp nào đã được tải theo yêu cầu này và khớp với thư mục tôi đã chỉ định" Vì vậy, không phải bất kỳ hình ảnh nào trong thư mục đó, nhưng bất kỳ hình ảnh nào mà trang đã tham chiếu. –

3

Nó sẽ là một vấn đề bảo mật lớn nếu trình duyệt có thể yêu cầu danh sách thư mục - đó là lý do tại sao Tomcat biến khả năng đó theo mặc định ngay bây giờ.

Tuy nhiên, trình duyệt có thể xác định tất cả các kết quả phù hợp với các ký tự đại diện được tham chiếu bởi các trang mà nó lưu trữ. Cách tiếp cận này sẽ vẫn có vấn đề (giống như, về hình ảnh không được sử dụng ban đầu nhưng được đặt động bởi JavaScript, v.v. và nó sẽ yêu cầu tất cả các mục được lưu trong bộ nhớ cache không chỉ được tải xuống mà còn được phân tích cú pháp).

2

Nếu bạn đang thử tự động quá trình này, thay vì thực hiện thủ công. Sử dụng tập lệnh hoặc như tôi sử dụng manifestR. Nó sẽ xuất ra tệp kê khai/appcache của bạn và tất cả những gì bạn phải làm là sao chép và dán. Tôi đã sử dụng nó thành công và thường chỉ phải thực hiện một vài thay đổi.

Ngoài ra, tôi khuyên bạn nên sử dụng tiêu đề mạng với thẻ hoang dã:

NETWORK: 
* 

này cho phép toàn bộ tài sản từ các tên miền liên quan khác thông qua JSON, ví dụ, để tải vào bộ nhớ cache. Tôi tin rằng đây là tiêu đề duy nhất mà bạn có thể chỉ định một ký tự đại diện. Giống như những người khác đã nói ở đây, đó là vì lý do an ninh.

+3

Bạn đang ** Sai! ** Các tệp được liệt kê trong phần tiêu đề phần NETWORK: trong tệp kê khai bộ nhớ cache là các tài nguyên được liệt kê màu trắng yêu cầu kết nối với máy chủ. –

0

Tệp kê khai bộ nhớ cache hiện không còn được dùng nữa và bạn nên sử dụng tiêu đề HTML để kiểm soát bộ nhớ đệm.

Ví dụ:

<meta http-equiv="Cache-control" content="public"> 
  • công cộng - có thể được lưu trữ trong bộ nhớ đệm chia sẻ cộng đồng.
  • Riêng tư - chỉ có thể được lưu trong bộ nhớ cache riêng tư.
  • Không có bộ nhớ cache - không thể được lưu trong bộ nhớ cache.
  • Không lưu trữ - có thể được lưu trong bộ nhớ cache nhưng không được lưu trữ.