Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP脚本可以在Firefox中使用,但不能在Chrome中使用_Php_Html_Google Chrome_Firefox - Fatal编程技术网

PHP脚本可以在Firefox中使用,但不能在Chrome中使用

PHP脚本可以在Firefox中使用,但不能在Chrome中使用,php,html,google-chrome,firefox,Php,Html,Google Chrome,Firefox,我已经试着解决这个问题好几天了,但我找不到解决办法 所以我有一个非常基本的php脚本,它运行一个文本到语音的命令行工具,并输出一个mp3文件。我想为它创建一个前端,这里是: <!DOCTYPE HTML> <html lang = "en"> <head> <title>TTS App</title> <meta charset = "UTF-8" /> </head> <body> <cent

我已经试着解决这个问题好几天了,但我找不到解决办法

所以我有一个非常基本的php脚本,它运行一个文本到语音的命令行工具,并输出一个mp3文件。我想为它创建一个前端,这里是:

<!DOCTYPE HTML>
<html lang = "en">
<head>
<title>TTS App</title>
<meta charset = "UTF-8" />
</head>
<body>
<center>
<form action="ttsapp.php" method="post">
    <TEXTAREA name="text" rows="20" cols="80"></TEXTAREA><br>
    <select name="voice">
        <option value="4">English</option>
        <option value="3">French</option>
    </select>
    <input type="submit" value="Submit" />
</form>
</center>
</body>
</html>

TTS应用程序

英语 法语
下面是PHP代码

<?php
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
  define('ESPEAK', 'sapitts\tts.exe');
  define('LAME', 'eSpeak\command_line\lame\lame.exe');
} else {
  define('ESPEAK', '/usr/bin/espeak');
  define('LAME', '/usr/bin/lame');
}

if (!empty($_POST['voice'])) {
    $voice = $_POST['voice'];
} else {
  $voice = '4';
}
  $text = $_POST['text'];
  $filename = md5($text) . '.wav';

 $filepath =  'voicesmp3/v' . $voice . 's' . $filename;
 $filepath1 = 'voicesmp3/v' . $voice . 's' . md5($text) . '0' . '.mp3';
 $filepath2 = 'voicesmp3/v' . $voice . 's' . md5($text) . '0' . '.wav';
  $text = escapeshellarg($text);
if (!file_exists($filepath1)) {
  $cmd = ESPEAK." -v $voice -o $filepath $text && ".LAME." -q0 -b128 --vbr-new $filepath2";
    exec($cmd);
}
  header('Content-Type: audio/mpeg');
  header('Content-Length: ' . filesize($filepath1));
  readfile($filepath1);
?>

问题是: 正如我在标题中所说,这个脚本在Firefox中工作,但在Chrome中不工作。我决定用Fiddler进行调查,我发现Firefox只会发送一个帖子并播放正确的文件,但Chrome会发送一个帖子(得到正确文件的响应),然后Chrome会发送另一个GET请求。脚本将再次响应,但是因为没有POST变量,所以它们被保留为空,并且我得到一个没有声音的文件。我想做的是发布正确的变量,php脚本读取正确的文件,而不是像当前Chrome那样运行两次并播放空文件。我还应该提到,Chrome完成的第二个GET请求只是请求php文件,它的URL与POST文件相同

我正在Wampserver上托管文件


我真的不知道该怎么解决这个问题。我看不出我的代码中有任何可能导致问题的错误,因此,如果在座的任何人能够提供一些见解,说明为什么它在一个浏览器中工作,而不是在另一个浏览器中工作,以及如何修复它,我将不胜感激。

只是做了一个实验,我可以复制您的场景

这似乎与$filepath和$filepath1是否正确有关:

例如,如果我在文本区域中输入“Test”,然后选择English

$filepath1应该是:voicemp3/v4s0cbc661611f5540bd0809a388dc95a615b0.mp3

$filepath应该是:voicemp3/v4sd41d8cd98f00b204e9800998ecf8427e.wav

如果$filepath1中的文件不存在,代码将转到

if (!file_exists($filepath1)) {
    $cmd = ESPEAK." -v $voice -o $filepath $text && ".LAME." -q0 -b128 --vbr-new $filepath2";
    exec($cmd);
}
我真的无法想象这是怎么回事。可能根据$filepath1创建文件。但这取决于$filepath。如果$filepath中的文件也丢失,您将始终在Fiddler中找到一个GET请求,其中包含206个部分内容响应

所以我怀疑这可能是由于缺少wav/mp3文件造成的。它与浏览器行为无关

------------------------------------------------2017-03-03更新---------------------------------------------------

确认这是一个与Chrome相关的发布

chrome触发空GET请求的原因是重定向后生成的html:

铬:

<video controls="" autoplay="" name="media"><source src="http://127.0.0.1/test/ttsapp.php" type="audio/mpeg"></video>

火狐:

<video style="height: 28px; width: 66%;" controls="" autoplay=""></video>


由于src属性,chrome会再次调用URL。

me。在这一点上,我只能四处走走

之后

if (!file_exists($filepath1)) {
  $cmd = ESPEAK." -v $voice -o $filepath $text && ".LAME." -q0 -b128 --vbr-new $filepath2";
  exec($cmd);   
}

//这是将mp3文件编码为base64
$fileContent='数据:视频/mp3;base64'。base64_编码(文件获取内容($filepath1));
//在这里关闭PHP标记
?> 

谢谢你的回答!我已经在GET请求中使用这个脚本有一段时间了,实际上我刚刚切换到POST为它创建了一个前端。不过,该脚本可以很好地处理GET请求。有没有解释为什么它与GET一起工作,而与POST不一起工作。还有,我之所以有这么多文件路径,是因为我使用的命令行工具中有一些怪癖;它以一种奇怪的方式命名事物,并出于任何原因在每个文件名后面放置一个“0”。这是我提出的一个黑客解决方案,但如果它导致了问题,那么我可能不得不重新审视它。此外,在后端,所有文件都被完美地创建。唯一的问题是chrome,它会生成两组.mp3和.wav文件,这很奇怪。如果我从chrome上查看fiddler上的POST数据,然后转到webview,它实际上会显示播放器,并播放正确的文件和正确的文本。然后,当我去获取数据时,它会显示我在web浏览器中看到的内容;它显示一个没有声音的文件,时间是0:00。刚刚计算出来,它与chrome有关。会话状态:已中止。如果你不介意我问的话,你能解释一下你为解决这个问题所做的步骤吗?因为我花了好几天的时间调试,结果一无所获:我实际上在Fiddler中找到了它。使用chrome提交,您将看到两个响应:POST-200和GET-206,右键单击POST响应并选择“属性”。您将看到该响应的详细信息。嘿,谢谢您的修复,非常感谢。我想对到底发生了什么有一个确切的了解。你能解释一下你将它编码为base64的原因吗?实际上我是从生成的html代码中得到启发的。标记的src同时包含url和base64代码。因此,我可以让它呈现html,然后将src指向可接受的内容,而不是返回整个文件并告诉浏览器播放它。它的工作原理是一样的。
//This is to encode your mp3 file as base64     
$fileContent = 'data:video/mp3;base64,' . base64_encode(file_get_contents($filepath1));

//close the PHP tag here
?> 

<!-- From here it is pure html, point the SRC to the base64 -->
<video controls="" autoplay="" name="media"><source src="<?php echo $fileContent?>" type="audio/mpeg"></video>