使用客户端 clojurescript/re-frame 应用程序读入文件

Read in file with client-side clojurescript/re-frame app

我正在编写一个客户端应用程序,它应该读取文件、转换其内容然后导出结果。为此,我决定使用 Re-Frame。

现在,我刚刚开始全神贯注于 Re-Frame 和 cloujurescipt 本身,并让以下东西起作用:

在我的视图功能中的某个地方,每当通过简单的 HTML 输入选择新文件时,我都会发送此文件。

[:input {:class "file-input" :type "file"                                 
         :on-change #(re-frame/dispatch                                   
           [::events/file-name-change (-> % .-target .-value)])}]

我得到的是类似 C:\fakepath\file-name.txt 的东西,其中包含假路径。

我的事件处理程序目前只拆分名称并保存我上面输入订阅的文件名以显示所选文件。

(re-frame/reg-event-db                       
  ::file-name-change                       
   (fn [db [_ new-name]]                          
     (assoc db :file-name (last (split new-name #"\"))))) 

另外我想读入文件以便稍后在本地处理它。假设我只是更改我的 on-change 操作和事件处理程序来执行此操作,我该怎么做?

我搜索了一段时间,但几乎一无所获。唯一出现在其他框架之类的地方,但我不想为每个新问题引入新的依赖关系。

我假设您想使用 HTML5 APIs 在客户端中执行所有操作(例如,没有实际上传到服务器)。

这份来自 MDN 的指南可能会派上用场:https://developer.mozilla.org/en-US/docs/Web/API/File/Using_files_from_web_applications

看来你可以订阅用户选择文件时触发的事件,然后你可以获得所述文件的列表,并通过文件检查文件内容API:https://developer.mozilla.org/en-US/docs/Web/API/File

在您的情况下,您需要在某处的事件中保存对 FileList 对象的引用,并在以后重新使用它。