如何下载文件并在clojure中从内存中解压缩?

时间:2015-09-23 14:47:17

标签: clojure

我正在使用clj-http发出GET请求,而响应是一个zip文件。此zip的内容始终是一个CSV文件。我想将CSV文件保存到磁盘,但我无法弄清楚如何。

如果我将文件放在磁盘上,来自Raynes / fs库的(fs/unzip filename destination)效果很好,但我无法弄清楚如何将clj-http的响应强制转换为可读取的内容。如果可能,我想在没有

的情况下直接解压缩文件

我最接近的(如果它甚至接近)让我进入BufferedInputStream,但我从那里迷失了。

(require '[clj-http.client :as client])
(require '[clojure.java.io :as io])

(->
  (client/get "http://localhost:8000/blah.zip" {:as :byte-array})
  (:body)
  (io/input-stream))

2 个答案:

答案 0 :(得分:8)

您可以使用纯java java.util.zip.ZipInputStreamjava.util.zip.GZIPInputStream。取决于内容的压缩方式。这是使用java.util.zip.GZIPInputStream保存文件的代码:

(->
  (client/get "http://localhost:8000/blah.zip" {:as :byte-array})
  (:body)
  (io/input-stream)
  (java.util.zip.GZIPInputStream.)
  (clojure.java.io/copy (clojure.java.io/file "/path/to/output/file")))

使用java.util.zip.ZipInputStream使它变得更复杂:

(let [stream (->
                (client/get "http://localhost:8000/blah.zip" {:as :byte-array})
                (:body)
                (io/input-stream)
                (java.util.zip.ZipInputStream.))]
      (.getNextEntry stream)
      (clojure.java.io/copy stream (clojure.java.io/file "/path/to/output/file")))

答案 1 :(得分:0)

; :: require [clj-http.client:as httpc] ;:导入[java.io文件]

ResultSet results1 = statement.executeQuery("FETCH ALL ret1;");
ResultSet results2 = statement.executeQuery("FETCH ALL ret2;");
JRResultSetDataSource ret1 = new JRResultSetDataSource(results1);
JRResultSetDataSource ret2 = new JRResultSetDataSource(results2);  
JasperPrint print;                                         
print = JasperFillManager.fillReport(report, params, ret1);