如何读取post参数?

如何读取post参数?,post,file-io,erlang,nitrogen,chicagoboss,Post,File Io,Erlang,Nitrogen,Chicagoboss,我需要解析文本文件。此文件位于post参数中。我有这样的代码: upload_file('POST', []) -> File = Req:post_param("file"), 接下来我该怎么办?如何解析它?答案实际上取决于“文件”的内容。例如,如果文件内容包含一个具有以下erlang语法的字符串: [{{20,4},0}, {{10,5},0}, {{24,1},0}, {{22,1},0}, {{10,6},0}]. 可以使用以下代码读取: File = Req:

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

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

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

答案实际上取决于“文件”的内容。例如,如果文件内容包含一个具有以下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,enoint}}
仅仅意味着
file:read_file(file)
的返回值的形式不是预期的
{ok,B}
,而是
{error,enoint}
,这意味着当前路径中不存在文件
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

答案实际上取决于“文件”的内容。例如,如果文件内容包含一个具有以下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,enoint}
只是意味着
file:read\u file(file)
的返回值不是预期的
{ok,B}
,而是
{error,enoint}
,这意味着当前路径中不存在文件
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

Req:post_参数(“文件”)
中有什么内容

假设它是一个文件路径:您是否检查了
文件的值

无论如何,您可能正在寻找的是
Req:post_files/0

[{_, _FileName, TempLocation, _Size}|_] = Req:post_files(),
{ok,Data} = file:read_file(TempLocation),
把文件放在临时位置也可能是个坏主意,你最好找一个更合适的地方存放它们


似乎
上传的\u文件
记录现在有5个字段()

这是更新后的示例,带有第五个字段:

[{_, _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),

另一个警告:任何erlanger都会看到,上面的代码只处理第一个文件,可能大多数情况下只处理上传的文件。如果同时上传更多的文件,这些文件将被忽略。

里面有什么
Req:post_param(“文件”)

假设它是一个文件路径:您是否检查了
文件的值

无论如何,您可能正在寻找的是
Req:post_files/0

[{_, _FileName, TempLocation, _Size}|_] = Req:post_files(),
{ok,Data} = file:read_file(TempLocation),
把文件放在临时位置也可能是个坏主意,你最好找一个更合适的地方存放它们


似乎
上传的\u文件
记录现在有5个字段()

这是更新后的示例,带有第五个字段:

[{_, _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),

另一个警告:任何erlanger都会看到,上面的代码只处理第一个文件,可能大多数时候只处理上传的文件。如果同时上传更多的文件,这些文件将被忽略。

在第二行,我有
{{badmatch,{error,enoint}
(我正在尝试上传txt文件)我已经编辑了答案,以了解有关错误管理的更多详细信息。您应该更仔细地阅读我的答案和文档。正如我所说,您的问题非常“开放”,并没有说明您要解析什么,答案仅对解析erlang语法有价值。在第二行中,我有
{badmatch,{error,enoint}
(我正试图上传txt文件)我已经编辑了答案,以了解有关错误管理的更多详细信息。您应该更仔细地阅读我的答案和文档。正如我所说,您的问题非常“开放”,并没有说您要解析什么,答案只对解析erlang语法有价值。我已经尝试过了,但我有
{badmatch[{上传的_文件,“1_attlog.dat”,“/scratch/155-140-145-26-154-164-240-224-190-181-119-159-23-133-132-88”,273,“file”},
嗯,你使用了比我以前更新的版本,他们在记录中添加了第五个字段。更新了答案,现在应该很好。更安全(未来更安全)使用它的方法是使用
uploaded_file
模块访问文件以访问字段(或者在较新版本中,该模块已重命名为
sb_uploaded_file
,以避免名称空间冲突)。我尝试过这个方法,但我有
{badmatch,[{uploaded_file,“1_attlog.dat”,“/scratch/155-140-145-26-154-164-240-224-190-181-119-159-23-133-132-88”,273,“文件”}],
嗯,您使用的是更新的版本