[Catalyst] Catalyst::Request::Upload->filename is not decoded.
Bill Moseley
moseley at hank.org
Thu Dec 18 01:21:15 GMT 2014
All my upload forms have accept-charset="utf-8". We expect that uploaded
filenames could have wide-characters.
The problem I hit was ->basename does this:
$ perl -le 'use Catalyst::Request::Upload; my $upload =
Catalyst::Request::Upload->new( { filename => q[документ обучения.pdf] } );
print $upload->basename;'
_.pdf
That's pretty mangled.
The problem is that $upload->filename is not decoded so the substitution is
working on octets not characters.
sub _build_basename {
my $self = shift;
my $basename = $self->filename;
$basename =~ s|\\|/|g;
$basename = ( File::Spec::Unix->splitpath($basename) )[2];
$basename =~ s|[^\w\.-]+|_|g;
return $basename;
}
Obviously, we want \w to work on characters, not encoded octets. Decoding
the filename should be done -- it's character data.
Does it make sense to do it in Engine's prepare_uploads?
For example:
my $u = Catalyst::Request::Upload->new(
size => $upload->{size},
type => scalar $headers->content_type,
headers => $headers,
tempname => $upload->{tempname},
filename =>
*$c->_handle_unicode_decoding($upload->{filename})*,
);
--
Bill Moseley
moseley at hank.org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.scsys.co.uk/pipermail/catalyst/attachments/20141217/34cb57ca/attachment.htm>
More information about the Catalyst
mailing list