<div dir="ltr"><div>All my upload forms have accept-charset="utf-8". We expect that uploaded filenames could have wide-characters.</div><div><br></div>The problem I hit was ->basename does this:<div><br></div><div><div>$ perl -le 'use Catalyst::Request::Upload; my $upload = Catalyst::Request::Upload->new( { filename => q[документ обучения.pdf] } ); print $upload->basename;'</div><div>_.pdf</div><div><br></div><div>That's pretty mangled.</div><div><br></div><div><br></div><div>The problem is that $upload->filename is not decoded so the substitution is working on octets not characters. </div><div><div><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div><font face="monospace">sub _build_basename {</font></div></div><div><div><font face="monospace"> my $self = shift;</font></div></div><div><div><font face="monospace"> my $basename = $self->filename;</font></div></div><div><div><font face="monospace"> $basename =~ s|\\|/|g;</font></div></div><div><div><font face="monospace"> $basename = ( File::Spec::Unix->splitpath($basename) )[2];</font></div></div><div><div><font face="monospace"> $basename =~ s|[^\w\.-]+|_|g;</font></div></div><div><div><font face="monospace"> return $basename;</font></div></div><div><div><font face="monospace">}</font></div></div></blockquote><div><div><br></div><div>Obviously, we want \w to work on characters, not encoded octets. Decoding the filename should be done -- it's character data.</div><div><br></div><div>Does it make sense to do it in Engine's prepare_uploads?</div><div><br></div><div>For example:</div><div><br></div><div><div><font face="monospace"> my $u = Catalyst::Request::Upload->new(</font></div><div><font face="monospace"> size => $upload->{size},</font></div><div><font face="monospace"> type => scalar $headers->content_type,</font></div><div><font face="monospace"> headers => $headers,</font></div><div><font face="monospace"> tempname => $upload->{tempname},</font></div><div><font face="monospace"> filename => <b>$c->_handle_unicode_decoding($upload->{filename})</b>,</font></div><div><font face="monospace"> );</font></div></div><div><br></div><div><br></div>-- <br><div class="gmail_signature">Bill Moseley<br><a href="mailto:moseley@hank.org" target="_blank">moseley@hank.org</a></div>
</div></div></div></div>