Ознакомьтесь с Mojo :: Upload документами. Mojo :: Upload не является файловым дескриптором; Чтобы прочитать содержимое загруженного файла, проще всего использовать метод slurp
, или, если вы действительно хотите прочитать его построчно, вы можете преобразовать его в ресурс File и извлечь из него дескриптор. [116 ]
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)) {
...
}
JdbcTemplate использует DataSource, поэтому не гарантируется, что вы будете использовать то же соединение для оператора LOCK TABLE и того, что вы собираетесь делать в следующий вызов JdbcTemplate. Поэтому важно, чтобы вы делали это в транзакции. Настройте PlatformTransactionManager, либо DataSourceTransactionManager в DataSource JdbcTemplate, или JtaTransactionManager, если JdbcTemplate использует JNDI DataSource, предоставленный контейнером. Вы можете аннотировать свой метод как @Transactional или создать транзакцию программно с помощью PlatformTransactionManager.