2012-07-06 38 views
6

Tôi đang tạo một máy chủ tệp tĩnh trong Clojure với Compojure và tôi bị kẹt khi đọc một hình ảnh từ hệ thống tệp và hiển thị hình ảnh đó thông qua một tuyến đường Compojure.Cách đọc nội dung của tệp nhị phân trong một chuỗi trong Clojure?

Slurp tiếc là không xử lý dữ liệu nhị phân rất tốt, và tôi đã cố gắng này 100 cách khác nhau từ đó, nhưng điều này là mới nhất thất bại của tôi:

(defn image-output [filepath] 
    (try 
    (let [contents (apply str (with-open [rdr (io/reader filepath)] 
     (into #{} (line-seq rdr))))] 
     { 
     :status 200 
     :headers 
     { 
      "Content-Type" "image/jpeg", 
      "Content-Length" "", 
      "Cache-Control" "", 
      "Expires" "" 
     } 
     :body contents 
     })) 
    (catch Exception e {:status 404}))) 

(defn endpoint_view [params] 
    (if (contains? params :bucket) 
    (image-output (join "/" [data_path (:bucket params) (:dir params) (:filename params)])))) 

(defroutes main-routes 
    (GET "/view/:bucket/:dir/:filename" {params :params} (endpoint_view params)) 
    (route/files "/") 
    (route/resources "/s" {:root "./public/s"}) 
    (route/not-found "Page not found")) 

Có vẻ như nỗ lực hiện nay phải chịu đựng số phận tương tự như sử dụng slurp, nơi tôi có thể lặp lại chuỗi nội dung và chuỗi nội dung và chuỗi được mã hóa, nhưng khi tôi thay đổi kiểu nội dung thành hình ảnh/jpeg đó là hình ảnh bị hỏng.

Tôi đã dành cả ngày hôm qua Google tìm kiếm, nhưng không có ví dụ nào đạt được mục tiêu tương tự và trong khi chúng giúp tôi hiểu thêm một chút về Java IO, chúng không đủ rõ ràng để giúp tôi có được nơi tôi cần , hoặc sản xuất cùng một kết quả mà tôi đã nhận được (ví dụ: Best way to read contents of file into a set in Clojure).

(! Điểm thưởng Imaginary nếu bạn có thể cho tôi biết làm thế nào để có được các loại nội dung từ filepath cũng như đó là câu hỏi tiếp theo của tôi)

Trả lời

7

Chỉ cần làm cho cơ thể được (io/file filepath) - Ring là hoàn toàn hạnh phúc để phục vụ tập tin cho bạn.

Chỉnh sửa điểm thưởng: bạn có thể sử dụng ring.middleware.file-info/wrap-file-info để nhận siêu dữ liệu tệp cho các tệp bạn trả về. Hoặc, bạn chỉ có thể phục vụ toàn bộ thư mục với (compojure.route/files "/public"), tất cả điều này gây rối cho bạn.

+1

Rất đáng tiếc. Bạn là chính xác thưa ngài! Tôi vẫn muốn biết cách đọc dữ liệu nhị phân trong chuỗi mặc dù tôi đã giết một ngày cố gắng tìm ra, nhưng điều này giải quyết được vấn đề trước mắt của tôi. Cảm ơn! –

+3

Đừng làm điều đó. Chuỗi không phải là nhị phân, không có gì tốt đẹp sẽ đến từ điều này. – amalloy

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