2016-04-04 13 views
1

JSからpythonスクリプト(サーバー上で動作する)にオーディオBLOBを送信したい。 My JS ajax ..このような感じです。javascriptからpythonにオーディオBLOBを送信するには?

var fileType = 'audio'; 
var fileName = 'output.wav'; 
var formData = new FormData(); 
formData.append(fileType + '-filename', fileName); 
formData.append(fileType + '-blob', blob); 
    $.ajax({ 
    type: 'POST', 
    url: 'http://localhost/python/audio.py', 
    data: {audio:formData}, 
     success: function(response) { 
     alert(respose); 
    } 
    }); 

と私のpythonスクリプトはこのように見えます。

#!/usr/bin/python3 
print("Content-Type: text/html") 
print() 
import ssl 
import cgi 
import wave 
import contextlib 
form = cgi.FieldStorage() 
fname = form.getvalue("audio", "error") 
with contextlib.closing(wave.open(fname,'r')) as f: 
    frames = f.getnframes() 
    rate = f.getframerate() 
    duration = frames/float(rate) 
    print(duration) 

今、私はテストしているので、オーディオファイルの再生時間を取得する必要があります。ブロブはrecord.jsによって生成されます

これは機能しません。これは、Pythonがファイルを識別できないためです。どんな解決策ですか?

PS:Xampp Serverを使用してローカルホストで実行しています。 WojtekさんMarczenkoに対応して

:エラーは、適切にフォームフィールドとしてブロブを送信していないように見えます

[Mon Apr 04 18:26:09.537912 2016] [cgi:error] [pid 5330] [client ::1:60802] AH01215: Traceback (most recent call last):: /home/shashank/project/dutchman/python/audio.py, referer: http://localhost/index.html 
[Mon Apr 04 18:26:09.537978 2016] [cgi:error] [pid 5330] [client ::1:60802] AH01215: File "/home/shashank/project/dutchman/python/audio.py", line 10, in <module>: /home/shashank/project/dutchman/python/audio.py, referer: http://localhost/index.html 
[Mon Apr 04 18:26:09.538002 2016] [cgi:error] [pid 5330] [client ::1:60802] AH01215:  with contextlib.closing(wave.open(fname,'r')) as f:: /home/shashank/project/dutchman/python/audio.py, referer: http://localhost/index.html 
[Mon Apr 04 18:26:09.538024 2016] [cgi:error] [pid 5330] [client ::1:60802] AH01215: File "/usr/lib/python3.5/wave.py", line 499, in open: /home/shashank/project/dutchman/python/audio.py, referer: http://localhost/index.html 
[Mon Apr 04 18:26:09.538036 2016] [cgi:error] [pid 5330] [client ::1:60802] AH01215:  return Wave_read(f): /home/shashank/project/dutchman/python/audio.py, referer: http://localhost/index.html 
[Mon Apr 04 18:26:09.538056 2016] [cgi:error] [pid 5330] [client ::1:60802] AH01215: File "/usr/lib/python3.5/wave.py", line 163, in __init__: /home/shashank/project/dutchman/python/audio.py, referer: http://localhost/index.html 
[Mon Apr 04 18:26:09.538065 2016] [cgi:error] [pid 5330] [client ::1:60802] AH01215:  self.initfp(f): /home/shashank/project/dutchman/python/audio.py, referer: http://localhost/index.html 
[Mon Apr 04 18:26:09.538086 2016] [cgi:error] [pid 5330] [client ::1:60802] AH01215: File "/usr/lib/python3.5/wave.py", line 128, in initfp: /home/shashank/project/dutchman/python/audio.py, referer: http://localhost/index.html 
[Mon Apr 04 18:26:09.538097 2016] [cgi:error] [pid 5330] [client ::1:60802] AH01215:  self._file = Chunk(file, bigendian = 0): /home/shashank/project/dutchman/python/audio.py, referer: http://localhost/index.html 
[Mon Apr 04 18:26:09.538110 2016] [cgi:error] [pid 5330] [client ::1:60802] AH01215: File "/usr/lib/python3.5/chunk.py", line 61, in __init__: /home/shashank/project/dutchman/python/audio.py, referer: http://localhost/index.html 
[Mon Apr 04 18:26:09.538119 2016] [cgi:error] [pid 5330] [client ::1:60802] AH01215:  self.chunkname = file.read(4): /home/shashank/project/dutchman/python/audio.py, referer: http://localhost/index.html 
[Mon Apr 04 18:26:09.538132 2016] [cgi:error] [pid 5330] [client ::1:60802] AH01215: AttributeError: 'NoneType' object has no attribute 'read': /home/shashank/project/dutchman/python/audio.py, referer: http://localhost/index.html 
+0

どの時点で「動作していませんか」? pythonはオーディオフォームデータを受け取りますか? –

+0

アラジンは、 "jquery.min.js:2846 Uncaught TypeError:Illegal invocation"の原因となっている問題があるようです。あたかもajaxをコメントアウトしたように、エラーは消えているようです。 –

+0

私は実際にどのデータがあなたのajax/javascriptフォームから送られてきたかを見るためにgoogle chromeの開発者用ツールを使う傾向があります。 –

答えて

2

です。 FormDataにblobを添付する適切な方法は、formData.append(fileType, blob, fileName);です。また、あなたの代わりに別のオブジェクトにそれを入れ子のちょうどFORMDATAを添付する必要があります

var formData = new FormData(); 
formData.append(fileType, blob, fileName); 
$.ajax({ 
    type: 'POST', 
    url: 'http://localhost/python/audio.py', 
    data: formData, 
    processData: false, // prevent jQuery from converting the data 
    contentType: false, // prevent jQuery from overriding content type 
    success: function(response) { 
     alert(response); 
    } 
}); 

出典:pythonの側では https://developer.mozilla.org/en-US/docs/Web/API/FormData/append http://www.mattlunn.me.uk/blog/2012/05/sending-formdata-with-jquery-ajax/

は、あなたが(PythonのドキュメントによるCGIモジュールを使用する必要がありますより多くのリンクを投稿することはできません)。私は正しい方法がこのようになると信じています:

form = cgi.FieldStorage() 
fname = form["audio"].filename 
print "Got filename:", fname # in case of problems see if this looks ok 

with contextlib.closing(wave.open(fname,'r')) as f: 
    ... 
+0

どのように私はこのファイルをpythonで回復するのですか?まだ何か問題があるようです。コメントに文字の制限があるように見えるので、問題のエラーを追加しています –

+0

答えを更新しました。検索した場合は、ドキュメント(https://docs.python.org/2/library/cgi.html)の例も参照できます。 'ファイル名' –

関連する問題