如何阅读帖子参数?

时间:2013-12-23 06:52:47

标签: post file-io erlang nitrogen chicagoboss

我需要解析文本文件。此文件位于post param中。我有这样的代码:

upload_file('POST', []) ->
    File = Req:post_param("file"),

接下来我该怎么办?如何解析它?

2 个答案:

答案 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