2012-07-06 10 views
6

Sto creando un file server statico in Clojure con Compojure e sono bloccato a leggere un'immagine dal file system e visualizzare quell'immagine attraverso una rotta Compojure.Come leggere il contenuto di un file binario in una stringa in Clojure?

slurp purtroppo non gestisce i dati binari molto bene, e ho provato questo 100 modi diversi da allora, ma questo è il mio ultimo tentativo fallito:

(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")) 

Sembra questo tentativo corrente subisce la stessa sorte come usare slurp, dove posso echo la stringa del contenuto e la sua stringa codificata, ma quando cambio il tipo di contenuto in image/jpeg è un'immagine spezzata.

Ho passato tutto il giorno ieri la ricerca su Google, ma nessuno degli esempi ha raggiunto lo stesso obiettivo, e mentre mi hanno aiutato a capire un po 'di più sull'Io Java, non erano abbastanza chiari da aiutarmi ad arrivare dove dovevo andare , o prodotto gli stessi risultati che stavo già ricevendo (esempio: Best way to read contents of file into a set in Clojure).

(! Punti bonus Immaginario se potete dirmi come ottenere il tipo di contenuto dal percorso del file così come questa è la mia prossima domanda)

risposta

7

Basta fare il corpo sia (io/file filepath) - Ring è perfettamente felice di servire i file per tu.

Modifica per punti bonus: è possibile utilizzare ring.middleware.file-info/wrap-file-info per ottenere i metadati del file per i file restituiti. Oppure puoi semplicemente servire un'intera directory con (compojure.route/files "/public"), che fa tutto questo casino per te.

+1

Beh, dannazione. Lei ha ragione, signore! Sarei ancora interessato a sapere come leggere i dati binari in una stringa, anche se ho ucciso un giorno cercando di capirlo, ma questo risolve il mio problema immediato. Grazie! –

+3

Non farlo. Le stringhe non sono binari, non ne uscirà nulla di buono. – amalloy

Problemi correlati