2012-07-12 29 views
16

Tôi đang cố gắng cho phép người dùng tải ảnh lên máy chủ và sau đó xem chúng. Việc tải lên diễn ra như được mô tả in this guide. Đây là mã:Làm cách nào để phân phối các tệp đã tải lên trong Play! 2 bằng Scala?

def upload = Action(parse.multipartFormData) { request => 
    request.body.file("picture").map { picture => 
    import java.io.File 
    val filename = picture.filename 
    val contentType = picture.contentType 
    picture.ref.moveTo(new File("/tmp/picture")) 
    Ok("File uploaded") 
    }.getOrElse { 
    Redirect(routes.Application.index).flashing(
     "error" -> "Missing file" 
    ) 
    } 
} 

Tôi không rõ làm cách nào để phân phát ảnh đã tải lên cho người dùng muốn xem chúng. Ngay bây giờ tôi đang lưu trữ máy chủ trên máy tính của riêng tôi, vì vậy đoạn mã từ hướng dẫn ghi các tệp vào ổ D của tôi, không phải (và không nên) có sẵn từ Internet. Theo như tôi có thể thấy có 2 tùy chọn:

  1. Lưu trữ ảnh trong thư mục/công khai trong dự án của tôi (dự án dành riêng cho tài sản). Xem tại đây: http://www.playframework.org/documentation/2.0/Assets

  2. Viết trình điều khiển của riêng tôi phục vụ hình ảnh tạo thành vị trí tùy chỉnh từ ổ đĩa của tôi.

Đối với 1, tôi không chắc đó có phải là mục đích của nội dung hay không. Đối với 2, tôi không có ý tưởng làm thế nào để viết một bộ điều khiển như vậy.

Trả lời

9

2.0.3 sẽ có một số external Assets controller có thể là (sai) được sử dụng cho việc này. Viết một bộ điều khiển như vậy là không có phép thuật mặc dù, bạn có thư mục được xác định trước, nơi tất cả các tải lên của bạn được lưu, và đó là nơi bạn đọc chúng từ. Trong cơ sở dữ liệu, bạn lưu tên tệp (duy nhất).

Một cách tiếp cận khác là lưu các tệp được tải lên trong cơ sở dữ liệu. Chúng tôi làm điều này với GridFS trong MongoDB. Một bộ điều khiển tùy chỉnh phục vụ chúng trở lại cho người dùng. Bằng cách này, dữ liệu của bạn được lưu trữ ở một nơi trung tâm, điều này cũng giúp việc sao lưu và phục hồi đơn giản hơn.

+0

Thú vị . Đó là sự hiểu biết của tôi tuy nhiên, lưu trữ các tập tin ngay vào cơ sở dữ liệu có thể là thực hành xấu, sau câu hỏi này: http://stackoverflow.com/questions/11416735/how-to-upload-a-file-to-the-database- sử dụng-playframework-in-scala –

+1

Như mọi khi, nó phụ thuộc. GridFS được tạo ra một cách rõ ràng cho loại vấn đề này, cũng giống như Amazon S3. Nếu bạn lưu trữ các tập tin của bạn trong hệ thống tập tin địa phương, bạn có một vấn đề lớn khi bạn cần một máy chủ thứ hai một ngày. Hãy nhìn vào bộ điều khiển tài sản, không phải là khó hiểu. –

+0

Bạn cũng có thể sử dụng NAS để chia sẻ lưu trữ giữa các máy chủ và gắn nó vào đúng nơi. Bạn cũng có thể tải tệp của mình lên CDN và để tệp đó phân phối tệp của bạn. Đi với MongoDB chỉ để lưu trữ tập tin không phải là lựa chọn tốt hơn tôi nghĩ. – iwalktheline

18

Các ví dụ đơn giản là

def index = Action { 
    Ok.sendFile(new java.io.File("/tmp/fileToServe.pdf")) 
} 

có "Phục vụ các file" ở https://www.playframework.com/documentation/2.4.x/ScalaStream#Serving-files điều này giải thích làm thế nào để phục vụ các tập

+0

Tôi sẽ ưu tiên giải pháp này hơn là bộ điều khiển ExternalAssets vì nó bị tắt trong chế độ Phát triển. –

+0

Câu hỏi không phải là về cách phân phát tệp, nhưng cách phân phối ** tệp đã tải lên ** và nếu bạn có thể tải lên thư mục nội dung của mình. –

0

Bạn có thể thêm một tuyến đường mới như thế này:

GET  /myFiles/*file    controllers.Assets.at(path="/tmp", file) 
+0

Tôi không mong đợi điều này để làm việc: "Trong quá trình xây dựng, nội dung của thư mục công cộng được xử lý và thêm vào classpath ứng dụng." – stewSquared

+0

Nội dung của thư mục PUBLIC ... Đọc phần còn lại của tài liệu. Nó sẽ hoạt động bình thường. -> https://www.playframework.com/documentation/2.0/Assets – Peanut

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