3

我正在尝试以编程方式从此rss 提要下载 mp3 文件。当我打开诸如http://menlochurch.podbean.com/mf/feed/5gv2gb/170219_jortberg.mp3之类的网址时, 它会重定向到如下网址:http://s62.podbean.com/pb/67f34563539acbe87b9566ecc5738d57/58aeff8e/ data4/fs145/948579/uploads/170219_jortberg.mp3

如果我curl是第一个 url,它会下载一个空文件。

如果我curl -L是第一个 url,它会正确下载文件。

如果我curl是第二个 url,它会正确下载文件。

如果我slurp是 Clojure 中的第一个 url,它会下载一些看起来像 mp3(很大并且没有清晰的文本)但无法播放且与curl -L.

如果我slurp是 Clojure 中的第二个 url,它还会下载一些看起来像 mp3 的东西(很大并且没有清晰的文本),但是无法播放,并且与前一个的输出不同,curl -L并且与前一个的输出相同slurp

➜ ~ git:(master) ✗ ls -l *.mp3 -rw-r--r-- 1 adam adam 38038533 Feb 23 08:32 curl-url1.mp3 -rw-r--r-- 1 adam adam 38038533 Feb 23 08:37 curl-url2.mp3 -rw-r--r-- 1 adam adam 0 Feb 23 08:45 curl-without-L.mp3 -rw-r--r-- 1 adam adam 67144297 Feb 23 08:31 slurp-url1.mp3 -rw-r--r-- 1 adam adam 67144297 Feb 23 08:31 slurp-url2.mp3

正如你所看到的,我在啜饮的东西几乎是我卷曲的两倍。

我不知道该怎么做,我是否slurp在不适当的环境中使用?任何意见,将不胜感激!

4

2 回答 2

4

slurp适用于字符串,因此不适用于二进制数据。

user=> (doc slurp)
-------------------------
clojure.core/slurp
([f & opts])
  Opens a reader on f and reads all its contents, returning a string.
  See clojure.java.io/reader for a complete list of supported arguments.
于 2017-02-23T16:59:12.590 回答
2

虽然无法读取二进制数据,但以下函数将执行类似于slurp但接受二进制流的操作:

(defn copy-uri-to-file [uri file] (with-open [in (clojure.java.io/input-stream uri) out (clojure.java.io/output-stream file)] (clojure.java.io/copy in out)))

对于这个特定的示例,可以像这样下载 mp3 文件:

(copy-uri-to-file "http://menlochurch.podbean.com/mf/feed/5gv2gb/170219_jortberg.mp3" "foo.mp3")

于 2017-02-23T20:50:50.060 回答