【发布时间】:2014-03-14 12:55:34
【问题描述】:
我正在使用cherrypy 将WAV 文件从浏览器保存到本地磁盘。来电:
{'audio_file': [<cherrypy._cpreqbody.Part object at 0x7fd95a409a90>, <cherrypy._cpreqbody.Part object at 0x7fd95a178190>], 'user_data': u'{"id":"1255733204",'audio_length': [u'10.03102', u'22.012517', u'22.012517']}
我收到此错误:
try:
f = open('/audiostory/'+filename,'wb')
logging.debug( '[SAVEAUDIO] tried to write all of audio_file input at once' )
f.write(kw.get('audio_file'))
f.close()
logging.debug( ('saved media file %s to /audiostory/' % f.name) )
except Exception as e:
logging.debug( ('saved media NOT saved %s because %s' % (f.name,str(e))) )
"Must be convertible to a buffer, not Part."
那么我该如何处理这种数据,cherrypy 正在转换为“.Part”,但它应该是原始 wav 数据?我是否缺少标题或其他内容?
更新
Jason - 你会看到我故意没有发送任何标题或诸如此类的东西,因为我想看看cherrypy会提供什么原始文件。这是cherrypy site.py文件:
@cherrypy.expose
def saveaudio(self, *args, **kw):
import audiosave
return audiosave.raw_audio(kw.get('audio_file'))
还有audiosave里面的功能:
def raw_audio(raw):
""" is fed a raw stream of data (I think) and saves it to disk, with logging. """
import json
import logging
LOG_FILENAME = 'error.log'
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG)
logging.debug( '[SAVEAUDIO(raw)]'+str(raw) )
filename = assign_filename()
try:
#SAVE FILE TO DISK /s/audiostory/
f = open('/home/djotjog/webapps/s/audiostory/'+filename,'wb')
logging.debug( '[SAVEAUDIO] tried to write all of audio_file input at once' )
f.write(raw)
f.close()
logging.debug( ('media SAVED %s' % f.name) )
except Exception as e:
logging.debug( ('media NOT saved %s because %s' % (f.name,str(e))) )
return json.dumps({"result":"414","message":"ERROR: Error saving Media file "+f.name})
return raw
我也试过 f.write(raw.file.read()) 但出现同样的错误。
【问题讨论】:
-
你能分享用于请求文件的 HTML 吗?此外,如果您在 CherryPy 处理程序中执行任何特殊操作(启用工具等),也请包括在内。
-
HTML 是一个涉及到的 JavaScript,您可以在这里找到:djotjog.com/hadithi/tellme/index.min.html
-
我询问 HTML 的原因是因为很难分辨浏览器正在发送什么。我有一个带有简单“上传”表单的软件,cherrypy 将文件作为 audio_file.file 属性提供。您获得 Part 对象列表的事实表明正在使用不同的编码或技术。