尝试更新(或创建)记录时,我收到无效的CSRF令牌错误.我正在使用Elixir v1.0.3,Erlang/OTP 17 [erts-6.3]和Phoenix v0.8.0(我想,我不知道如何查看Phoenix的版本).我正在创建一个Web应用程序,主要遵循Phoenix指南和Elixir Dose Jobsite示例资源.但是,当我尝试从html表单发布信息时,我收到无效的CSRF令牌错误.根据错误中给出的建议,我将'x-csrf-token':csrf_token添加到操作中.
edit.html.eex:
<h2>Edit Directory</h2>
<form class="form-horizontal" action="<%= directory_path @conn, :update, @directory.id, 'x-csrf-token': @csrf_token %>" method="post">
<div class="form-group">
<label for="directory" class="col-sm-2 control-label">Directory</label>
<div class="col-sm-10">
<input type="hidden" name="_method" value="PATCH">
<input type="text" class="form-control" value="<%= @directory.directory %>" name="directory" placeholder="Directory" required="required">
</div>
</div>
...
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
[error] #PID<0.579.0> running Ainur.Endpoint terminated
Server: localhost:4000 (http)
Request: POST /config/directories/2?x-csrf-token=
** (exit) an exception was raised:
** (Plug.CSRFProtection.InvalidCSRFTokenError) Invalid CSRF (Cross Site Forgery Protection) token. Make sure that all your non-HEAD and non-GET …Run Code Online (Sandbox Code Playgroud) 我想使用Elixir扫描音乐文件和读/写元数据(整个项目是关于学习Elixir - 所以请不要告诉我使用Python!).据我了解,我有两个选择:调用系统实用程序或(因为我知道的Erlang或Elixir中没有库)编写Elixir库.对于m4a文件,我对MP4Box进行系统调用,并将xml文件写入磁盘.然后我读入文件,解析它,并将数据加载到数据库中.
def parse(file_name) do
System.cmd("MP4Box", ["-diso",file_name])
Ainur.XmlParser.parse(xml_file_name(file_name))
|> get_tags
end
Run Code Online (Sandbox Code Playgroud)
非常慢,特别是对于数千个文件.我希望它在每次启动时运行以检查更改/新文件.
现在我正在尝试对带有id3标签的mp3做同样的事情.我在Ubuntu上尝试了libid3-tools,它只找到了id3v1标签.eyeD3只找到了id3v2标签.我的mp3都有,所以我需要确保有相同的(我想我可以删除id3v1标签,但我一直认为遗留设备需要id3v1标签).
音乐元数据是否有任何Erlang或Elixir库?如果没有,系统调用ubuntu实用程序是我的最佳选择(任何建议)?
或者我是否需要编写库以获得合理的性能?如果是这样,是否有一个功能语言的现有库我可以尝试移植?
或者是否可以直接从Elixir调用另一种语言编写的库(没有系统调用)?
我在歌曲文件中搜索id3标签.一个文件可以有id3v1,id3v1扩展标签(位于文件末尾)以及id3v2标签(通常位于开头).对于id3v1标签,我可以使用File.read(song_file)并拉出最后355个字节(扩展标签为128 + 227).但是,对于id3v2标签,我需要从头开始搜索文件,寻找10字节的id3v2模式.我想避免在搜索不同标签时反复打开和关闭同一文件的任何开销,所以我认为最好的方法是使用File.stream!(song_file)并将文件流发送到不同的函数来搜索不同的标签.
def parse(file_name) do
file_stream = File.stream!(file_name, [], 1)
id3v1_tags(file_stream)
|> add_tags(id3v2_tags(file_stream))
end
def id3v1_tags(file_stream) do
tags = Tags%{} #struct containing desired tags
<< id3_extended_tag :: binary-size(227), id3_tag :: binary-size(128) >> = Stream.take(file_stream, -355)
id3_tag = to_string(id3_tag)
if String.slice(id3_tag,0, 3) == "TAG" do
Map.put(tags, :title, String.slice(id3_tag, 3, 30))
Map.put(tags, :track_artist, String.slice(id3_tag, 33, 30))
...
end
if String.slice(id3_extended_tag, 0, 4) == "TAG+" do
Map.put(tags, :title, tags.title <> String.slice(id3_extended_tag, 4, 60))
Map.put(tags, :track_artist, tags.track_artist <> String.slice(id3_extended_tag, 64, 60))
...
end …Run Code Online (Sandbox Code Playgroud)