我需要解析文本文件。此文件位于post param中。我有这样的代码:
upload_file('POST', []) ->
File = Req:post_param("file"),
接下来我该怎么办?如何解析它?
答案 0 :(得分:3)
Req:post_param("file")
内有什么?
您认为它是文件的路径:您是否检查了File
的值?
无论如何,你可能正在寻找Req:post_files/0
:
[{_, _FileName, TempLocation, _Size}|_] = Req:post_files(),
{ok,Data} = file:read_file(TempLocation),
将文件留在临时位置也可能是一个坏主意,你最好找一个更适合存放它们的地方。
uploaded_file
记录似乎现在有5个字段(for 10 months by now)。
这是更新的示例,第五个字段:
[{_, _FileName, TempLocation, _Size, _Name}|_] = Req:post_files(),
{ok,Data} = file:read_file(TempLocation),
哦,因为它是一个记录,即使定义再次更新,下面的示例也应该有效:
[File|_] = Req:post_files(),
{ok,Data} = file:read_file(File#uploaded_file.temp_file),
另一个警告:上面的代码,正如任何错误的人都会看到的那样,只处理第一个,而且大多数情况下,只处理上传的文件。如果同时上传更多文件,这些文件将被忽略。
答案 1 :(得分:1)
答案实际上取决于“文件”的内容。例如,如果文件内容是一个符合erlang语法的字符串,例如:
[{{20,4},0},
{{10,5},0},
{{24,1},0},
{{22,1},0},
{{10,6},0}].
可以使用以下代码阅读:
File = Req:post_param("file"),
{ok,B} = file:read_file(File),
{ok,Tokens,_} = erl_scan:string(binary_to_list(B)),
{ok,Term} = erl_parse:parse_term(Tokens),
%% at this point Term = [{{20,4},0},{{10,5},0},{{24,1},0},{{22,1},0},{{10,6},0}]
<强> [编辑] 强>
Erlang库使用大部分时间元组作为返回值。它可以帮助管理正常情况和错误情况。在前面的代码中,所有行仅与成功案例“模式匹配”。这意味着如果任何操作失败,它将崩溃。如果周围的代码导致错误,您将能够管理错误情况,否则该过程将简单地报告错误匹配错误。
我选择了这个实现,因为在这个级别的代码中,没有什么可以处理错误。 {{badmatch,{error,enoent}}
只是意味着file:read_file(File)
的返回值不是预期的{ok,B}
形式,而是{error,enoent}
,这意味着文件File
没有存在于当前路径中。
文档摘录
read_file(Filename) -> {ok, Binary} | {error, Reason}
Types:
Filename = name()
Binary = binary()
Reason = posix() | badarg | terminated | system_limit
Returns {ok, Binary}, where Binary is a binary data object that contains the contents of Filename, or {error, Reason} if an error occurs.
Typical error reasons:
enoent
The file does not exist.
eacces
Missing permission for reading the file, or for searching one of the parent directories.
eisdir
The named file is a directory.
enotdir
A component of the file name is not a directory. On some platforms, enoent is returned instead.
enomem
There is not enough memory for the contents of the file.
在我看来,调用代码应该管理这种情况,如果它是一个真实的用例,例如File
来自用户界面,或者如果不应该发生这种情况则让错误不受管理。在你的情况下你可以做
try File_to_term(Params) % call the above code with significant Params
catch
error:{badmatch,{error,enoent}} -> file_does_not_exist_management();
error:{badmatch,{error,eacces}} -> file_access_management();
error:{badmatch,{error,Error}} -> file_error(Error)
end