我正在制作一个cgi脚本,我将上传一个音频文件,下采样更改为 8000Hz ,然后将其识别出来
我在对文件进行下采样时遇到错误。下采样的代码如下:
1)文件上传代码:
use CGI;
use strict;
use File::Copy qw(copy);
use CGI::Carp 'fatalsToBrowser';
my $PROGNAME = "file_upload.cgi";
my $cgi = new CGI();
print "Content-type: text/html\n\n";
my $upfile = $cgi->param('upfile');
# Get the basename in case we want to use it.
my $basename = GetBasename($upfile);
no strict 'refs';
if (! open(OUTFILE, ">../cgi-bin/upload/".$basename) ) {
print "Can't open for writing - $!";
exit(-1);
}
2)下采样代码:
my $source_file="/var/www/cgi-bin/upload/$upfile";
system("sox $source_file -r 8000 /var/www/cgi-bin/upload/temp.wav".";"."mv /var/www/cgi-bin/upload/temp.wav $source_file");
其中:
$upfile
是已上传的wav文件的名称错误
sox FAIL格式:无法打开输入文件`/var/www/cgi-bin/upload/file1.wav':WAVE:找不到RIFF标题
file1.wav是我上传的文件
请帮助我理解为什么 sox 命令在正确写入的情况下没有执行?
答案 0 :(得分:1)
这不是你问题的真正答案,因为我们还没有足够的信息。
您是否尝试过从Unix命令行运行命令?我假设你得到同样的错误。如果您对已保存的文件运行file
,会得到什么?文件在上传之前和之后有多大?
您不显示编写上传文件的代码。我怀疑那里有一个错误。如果您将其添加到您的问题中,我们可以帮助您找到它。
GetBasename()
在哪里定义?我们能看到代码吗?
您的sox
命令似乎很奇怪。您在名为sox
的文件上运行temp.wav
,然后将该文件复制到您上传的文件中。也许有几个步骤你没有告诉我们。
其他一些改进建议:
cgi->new
,而不是new CGI
。后者有一些奇怪的角落案例,如果你碰到它们,你将会遇到调试的真正问题。CGI
模块,那么为什么不使用其header
方法而不是编写自己的(技术上不正确的)标头。no strict 'refs'
是一个非常糟糕的主意(据我所见,这里不需要)。请使用open()
的三个arg版本和词法文件句柄
open my $out_fh, '>', "../cgi-bin/upload/$basename"
在错误消息中包含文件路径
my $file = "../cgi-bin/upload/$basename";
if (!open my $out_fh, '>', $file) {
print "Can't open file '$file' for writing - $!";
exit(-1);
}
您正在加载File::Copy
模块,但随后使用shell命令移动文件。
允许随机用户将文件上传到cgi-bin
目录下的目录是一个巨大的潜在安全漏洞。您应该找到另一个目录来存储上传的文件。
哦,然后就是全部 - 为什么在地球上你会在2017年写CGI课程!
答案 1 :(得分:0)
问题已解决。我在执行sox和copy命令时遇到问题的原因是因为我将两个命令放在代码中。基本上是初学者的错误。所以我打开了问题陈述中提到的文件。在关闭文件处理程序之前,我将copy和sox命令用于执行,因此它们没有成功执行。