2012-07-06 5 views
6

Ich erstelle einen statischen Dateiserver in Clojure mit Compojure und ich bleibe dran, ein Bild aus dem Dateisystem zu lesen und dieses Bild über eine Compojure-Route anzuzeigen.Wie lese ich den Inhalt einer Binärdatei in eine Zeichenfolge in Clojure?

schlürft leider nicht verarbeitet binäre Daten sehr gut, und ich habe versucht, diese 100 verschiedene Möglichkeiten, da, aber das ist mein letzter gescheiterter Versuch:

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

Es scheint, leidet dieser aktuelle Versuch, das gleiche Schicksal wie slurp verwenden, wo ich die Inhaltszeichenfolge und ihre und codierte Zeichenfolge wiedergeben kann, aber wenn ich den Inhaltstyp zu image/jpeg ändere, ist es ein zerbrochenes Bild.

Ich verbrachte den ganzen Tag gestern Google suchen, aber keines der Beispiele erreicht das gleiche Ziel, und während sie mir ein wenig mehr über Java IO zu verstehen, waren sie nicht klar genug, um mir zu helfen, wo ich gehen musste , oder produzierte die gleichen Ergebnisse, die ich bereits erhielt (Beispiel: Best way to read contents of file into a set in Clojure).

(! Imaginary Bonuspunkte, wenn Sie mir sagen, wie Sie den Inhaltstyp aus dem Dateipfad zu erhalten sowie dass meine nächste Frage ist)

Antwort

7

Nur der Körper (io/file filepath) sein machen - Ring vollkommen glücklich ist, um Dateien zu dienen Sie.

Für Bonuspunkte bearbeiten: Sie können ring.middleware.file-info/wrap-file-info verwenden, um Dateimetadaten für die von Ihnen zurückgegebenen Dateien abzurufen. Oder Sie könnten einfach ein ganzes Verzeichnis mit (compojure.route/files "/public") bedienen, was Ihnen das ganze Chaos bereitet.

+1

Nun verdammt. Sie sind richtig, Herr! Ich wäre immer noch daran interessiert zu wissen, wie binäre Daten in einer Zeichenfolge zu lesen, obwohl ich einen Tag getötet habe versuchen, es herauszufinden, aber das löst mein unmittelbares Problem. Vielen Dank! –

+3

Tu es nicht. Strings sind nicht binär, nichts Gutes wird daraus entstehen. – amalloy

Verwandte Themen