7

Trong Grails 3.0, bạn ánh xạ URL như thế nào với một tệp trong thư mục assets?UrlĐịnh dạng để trỏ URL đến tệp đường dẫn nội dung trong Grails

Ví dụ:
http://localhost:8080/favicon.ico ->grails-app/assets/images/bookmark.ico

Tôi đã thử một vài ánh xạ kiểm tra, chẳng hạn như:

grails-app/controllers/UrlMappings.groovy

class UrlMappings { 

    static mappings = { 
     ... 
     "/t1.png" (uri: "/assets/images/test.png") 
     "/t2.png" (uri: "/assets/test.png") 
     "/t3.png" (uri: "/images/test.png") 
     "/t4.png" (dir: "assets/images", file: "test.png") 
     ... 
     } 

} 

... nhưng tất cả đều dẫn đến lỗi máy chủ 500.

Trả lời

0

tôi nghĩ rằng bạn cần để ánh xạ địa chỉ URL để AssetController của Plugin Asset, như thế này (không kiểm tra):

class UrlMappings { 
    static mappings = { 

    ... 

    "/files/$id" (controller :"AssetController", action:"index") 
     ... 
    } 
} 

HTH

+0

Đó là một cách tiếp cận thú vị, nhưng có vẻ như chỉ dẫn đến 404 (tôi đã thử thêm các hoán vị khác bằng cách sử dụng 'AssetController' không thành công). Bạn có một ví dụ làm việc cụ thể? –

+0

Thực ra không, đó chỉ là một ý tưởng. Tôi đã có một cái nhìn ngắn tại 'AssetController' một ý nghĩ có thể làm việc ... Có lẽ một cái nhìn vào' AssetTagLib' sẽ giúp bạn hiểu 'AssetPlugin' và bạn có thể viết Controller của chính bạn mà bạn muốn. – YAT

0

Nếu bạn không sử dụng các tài sản-Pipeline bạn có thể lập bản đồ tài nguyên tĩnh cho URL bằng cách làm theo các bước được nêu trong số Grails Documentation. Tuy nhiên, câu hỏi của bạn là hỏi cách ánh xạ một tài nguyên tới một URL với Asset-Pipeline plugin.

Burt Beckwith cung cấp thông tin chi tiết về Grails forum một vài năm trước về vai trò của Grail trong việc phân phát tài nguyên tĩnh.

Grails không phân phát tài nguyên tĩnh, vùng chứa sẽ hoạt động. Vì vậy, không có cách nào để định cấu hình trực tiếp bản đồ - bạn cần phải phân phối nó thông qua bộ điều khiển hoặc định cấu hình proxy như Eric đề xuất.

Burt

Câu trả lời này có thể không hài lòng. Nhưng nếu bạn phải phục vụ một tài nguyên tĩnh và hoàn toàn không muốn sử dụng một bộ điều khiển hoặc proxy, bạn có thể thử những điều sau đây.

Tạo chế độ xem có tên image.gsp. Chế độ xem sẽ chỉ chứa thẻ nội dung. Sử dụng các ví dụ của bạn ở trên,

<asset:image src="t1.png"/> 

Sau đó, định cấu hình ánh xạ URL của bạn để trỏ đến trang image.gsp.

class UrlMappings { 

    static mappings = { 
     ... 
     "/t1.png" (view: "image") 
     ... 
     } 

} 

Tôi nhận ra đây có thể không phải là phương pháp chính xác mà bạn đang hy vọng sử dụng. Nhưng tôi nghĩ rằng sự hiểu biết về vai trò của Grails so với container chạy Grails sẽ giúp thông báo quyết định phân phối đúng tài nguyên cho người dùng.

Tôi biết điều này có vẻ không liên quan nhưng nếu bạn muốn tạo trang liệt kê nội dung của một thư mục, hãy xem số post by CodePanda này. Mã của anh ta có thể được sử dụng như một khuôn mẫu để tạo ra một bộ điều khiển để phục vụ một tệp duy nhất và anh ta giải thích cách cập nhật khung nhìn, bộ điều khiển và groovy.config.

+0

Giải pháp này có thực sự hoạt động không? Nó trông rất giống với '" /t3.png "(uri:" /images/test.png ")' từ câu hỏi gốc, và điều đó không hiệu quả đối với tôi. Lưu ý rằng câu hỏi là về ánh xạ một URL (** số ít **) tới một tệp (** số ít **). –

+0

Tôi đã xác minh rằng nó hoạt động. Thử ánh xạ tới một tệp bên ngoài thư mục nội dung. Đặt nó vào thư mục dự án grails và xem liệu bạn có thể ánh xạ một URL tới nó hay không. – Nathan

+0

Bạn đã sử dụng URL nào? (lưu ý: ánh xạ tới một tệp bên ngoài thư mục 'asset' không có giá trị nào vì bạn thậm chí không cần ánh xạ.) –

0

Dưới đây là những gì tôi sử dụng để phục vụ lên swfobject.js tại một URI cụ thể:

Thêm một ánh xạ url:

"/swf/swfobject.js" (controller:"facerecorder", action:"swfobject") 

Thêm một hành động để điều khiển mà nằm tài nguyên và phục vụ nó. Lưu ý rằng assetResourceLocator, là một phần của đường ống nội dung, được đưa vào bộ điều khiển.

class FacerecorderController { 

    def assetResourceLocator 

    def swfobject() { 
     def resource = assetResourceLocator.findAssetForURI('swf/swfobject.js') 
     render file: resource.inputStream, contentType: 'text/javascript' 
    } 
} 

Đó chắc chắn không phải lý tưởng, nhưng nó hoạt động. Được thử nghiệm bằng Grails 3.0.17

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