使用纯Perl获取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

在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","...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应用程序中使用,因此我将对其进行修改。非常感谢。