如何像CGI Perl一样在Mojolicious中上传文件?

时间:2019-02-21 03:21:19

标签: perl csv upload mojolicious

使用Mojo::Upload时出现问题,这与上传CGI文件perl不同。 我需要阅读上传的CSV文件中的行,并使用以下CGI代码,它可以正常工作!

my $upfile = $cgi->param('file');
my $originhead;

while(my $line = <$upfile>){
    $originhead = $line if($first_count == 0);
    $first_count++;
}

$ originhead ='id,abc,cda'没关系

对于Mojo,它不起作用

use Mojo::Upload;
my $upfile = $self->req->upload('file');

 my $originhead;

    while(my $line = <$upfile>){
        $originhead = $line if($first_count == 0);
        $first_count++;
    }
$originhead = null  fail

谢谢!

1 个答案:

答案 0 :(得分:1)

签出Mojo::Upload文档。 Mojo :: Upload不是文件句柄;要读取上载的文件的内容,最简单的方法是使用slurp方法,或者,如果您真的想逐行读取它,则可以将其转换为File资产并从中获取句柄。

use Mojo::Base 'Mojolicious::Controller';

sub action {
  my $self = shift;
  my $upfile = $self->req->upload('file');
  my $contents = $upfile->slurp;
  my $originhead = (split /^/, $contents)[0];

  # or
  my $file = $upfile->asset->to_file;
  my $handle = $file->handle;
  my ($originhead, $first_count);
  while (my $line = <$handle>) {
    $originhead = $line unless $first_count;
    $first_count++;
  }
}

要解析CSV,Text::CSV通常比替代方案要简单得多。

use Text::CSV 'csv';
my $array_of_hashes = csv(in => \$contents, headers => 'auto', encoding => 'UTF-8') or die Text::CSV->error_diag;

或用于逐行处理:

my $csv = Text::CSV->new({binary => 1, auto_diag => 2});
binmode $handle, ':encoding(UTF-8)' or die "binmode failed: $!";
$csv->header($handle);
while (my $row = $csv->getline_hr($handle)) {
  ...
}