无法使用sox对CGI perl脚本中的音频文件进行缩减采样

时间:2017-09-28 10:52:13

标签: perl cgi

我正在制作一个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");

其中:

  1. source_file是上传音频文件的路径
  2. $upfile是已上传的wav文件的名称
  3. temp.wav是使用mv命令在原始文件上覆盖的临时缩减采样文件
  4. 错误

      

    sox FAIL格式:无法打开输入文件`/var/www/cgi-bin/upload/file1.wav':WAVE:找不到RIFF标题

    file1.wav是我上传的文件

    请帮助我理解为什么 sox 命令在正确写入的情况下没有执行?

2 个答案:

答案 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命令用于执行,因此它们没有成功执行。