2012-01-18 25 views
0

我有一個文件speakWord.php:標題(「內容類型:音頻/ MPEG」)在DIV

<?php 
header("Content-Type: audio/mpeg"); 
$voice = file_get_contents('http://translate.google.com/translate_tts?tl=' . urlencode($_POST['language']) . '&q=' . urlencode($_POST['word']) . ''); 
?> 

<audio controls="controls" autoplay> 
    <source src="<?php echo $voice; ?>" /> 
</audio> 

現在我想使用jQuery來加載這個MP3文件,並將其輸出的結果一個div:

$("#speakWord") 
.load("speakWord.php", { 
    language: "nl", 
    word: "test" 
}); 

當我檢查了div的來源,它變得像一個很奇怪:

<source src="��@��#a�F(��y2i���Ǵ1�L A�@���'!D����΂��8" �=""> 

我覺得頭信息中speakWord丟失.PHP在一個div加載時,我想我缺少的一部分..

+3

您檢索二進制和它輸出到頁面。所以你在你的頁面上得到二進制。 – zerkms 2012-01-18 21:20:05

+1

你錯過了如何HTTP和HTML工作......你不能嵌入原始二進制數據轉換成'src'屬性和期望瀏覽器去了解它。 src屬性應該是可以從中獲取二進制數據的URL。 – 2012-01-18 21:59:09

回答

2

如果您確實需要通過腳本代理它(如果有任何Google API授權令牌),請將二進制數據打包到src=屬性的base64 data: URL中。

<?php 
    // Content-Type for whole PHP output remains text/html 
    $voice = file_get_contents('http://translate.google.com/translate_tts?tl=' . urlencode($_POST['language']) . '&q=' . urlencode($_POST['word']) . ''); 
?> 
<audio controls="controls" autoplay> 
    <source src="data:audio/mpeg;base64,<?php echo base64_encode($voice); ?>" /> 
</audio> 

然而,這是一個更大的轉移。

實際的答案,因爲已經給了,是你要分開的內容類型。你的腳本只能返回音頻數據,不能混合html和二進制內容。它在本質上應該僅僅是:

<?php 
    header("Content-Type: audio/mpeg"); 
    readfile('http://translate.google.com/translate_tts?tl=' . urlencode($_POST['language']) . '&q=' . urlencode($_POST['word']) . ''); 
?> 

因此,你必須構建通過jQuery的<audio>標籤(insted的AJAX加載它):

$("#speakWord") 
.html("<audio... src='speakWord.php?language=nl&word=test'></audio>"); 

所以這src=屬性中檢索從speakWord輸出腳本,這反過來從翻譯服務中獲取它。

0

src=意在指向一個URL,而不是充滿二進制數據。

你必須要麼

  • 發送的二進制數據,用適當的標題
  • 或發送HTML片段,引用(但不含)的二進制數據。

不都在同一時間。

+0

我想你需要補充的是,以「送二進制數據,用適當的頭*,並要求與另一個http請求數據*」 – zerkms 2012-01-18 21:27:49