使用纯Perl获取blob上传的数据
在Javascript中,我通过以下代码使用XHR发送blob:使用纯Perl获取blob上传的数据,perl,blob,cgi,Perl,Blob,Cgi,在Javascript中,我通过以下代码使用XHR发送blob: var v=new FormData(); v.append("EFD",new Blob([...Uint8Array...])); var h=new XMLHttpRequest(); h.setRequestHeader("Content-type","multipart/form-data; charset=utf-8"); h.open("POST
var v=new FormData();
v.append("EFD",new Blob([...Uint8Array...]));
var h=new XMLHttpRequest();
h.setRequestHeader("Content-type","multipart/form-data; charset=utf-8");
h.open("POST","...url...");
h.send(v);
在服务器中,我用Perl创建了以下函数,该函数假定实现CGI->param
和CGI->upload
:
# QS (Query String) receive in argument string for single parameter or array of many required parameters.
# If string been supplied: Return the value of the parameter or undef if missing.
# If array been supplied, a hash will be returned with keys for param names and their corresponding values.
# If the first argument is undef, then return hash with ALL available parameters.
sub QS {
my $b=$ENV{'QUERY_STRING'};
if($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN,$b,$ENV{'CONTENT_LENGTH'}) or die "E100";
}
my $e=$_[0]; my $t=&AT($e); my $r={}; my @q=split(/&/,$b);
my %p=(); if($t eq "A") { %p=map { $_=>1 } @{$e}; }
foreach my $i(@q) {
my ($k,$s)=split(/=/,$i); $s=~tr/+//; $s=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
if($t eq "") { $r->{$k}=$s; }
elsif($t eq "A") { if($p{$k}) { $r->{$k}=$s; } }
elsif($k eq $_[0]) { return $s; }
}
return $r;
}
# AT is a function for determining type of an object, and also a quck way to distinguish between just a string and a number.
sub AT {
if(!defined $_[0]) { return ""; } my $v=ref($_[0]);
if($v eq "") { return ($_[0]*1 eq $_[0])?"N":"S"; }
my $k={"ARRAY"=>"A","HASH"=>"H"};
return $k->{$v}||$_[0]->{_obt}||$v;
}
因此,在主程序中,它将被称为:
my $EFD=&FW::QS("EFD"); # FW = The module name where QS and AT are.
当我从客户端发出POST时,服务器中的脚本不会弹出任何错误,也不会终止-它会继续运行、运行、运行。。。。没完没了。。。。消耗100%的CPU时间和100%的内存-无需任何解释
不过,我在脚本的开头有以下内容:
use strict;
use warnings;
use diagnostics;
但它仍然以这样一种方式运行,我需要杀死脚本以终止它
谁知道我做错了什么。。。?据我所知,这里没有无限循环。。。如果我将Blob更改为“…url…?EFD=dhglkhserkhgoi”的常规经典方式,那么它可以正常工作,但我想要一个Blob
非常感谢此
QS
功能仅可用于带有应用程序/x-www-urlencoded
主体的POST
s,而您的主体不是。您实施位CGI有什么原因吗?CGI模块与Perl一起提供。如何调用QS
?什么是AT
功能?您可以将一些调试打印语句放入服务器以确定挂起的位置吗?您的任务并不明显。描述一下你试图实现的目标以及你选择这条道路的原因会很有帮助。提供blob内容如何生成的信息(它的内容是什么——图像、二进制文件等)将有助于理解task.CGI模块自v5.22以来从核心中删除,而上述内容是声称100%纯的新框架的一部分。目前,如上所述,脚本不会弹出任何错误,只是不会终止……这对Blob中二进制数据的内容是否重要?它只是被编码成二进制的任意对象:可以是数组,也可以是混合了数字的字符串散列。二进制的内容可以是任何东西,但通过描述您试图放入其中的内容,可能会产生实现相同/类似结果的其他方法的想法。例如,为什么不使用现有的框架(Catalyst、Dancer 2、Mojo、Ruby on Rails、Hanami、Sinatra、Grape、Django、Flask、Tornado、Lavarel等);name=“EFD”;filename=“blob”内容类型:应用程序/八位字节流,内容实际上是二进制的。。。。现在:我的webapp中没有其他发布方法,所以应该足够了。。。。QS方法是为常规POST/GET设计的,但它很少在我的web应用程序中使用,因此我将对其进行修改。非常感谢。