Java 玩框架[1.2.4]-通过wami记录器接受音频/xwav内容类型

Java 玩框架[1.2.4]-通过wami记录器接受音频/xwav内容类型,java,http,playframework,Java,Http,Playframework,我试图在浏览器端用录制一段声音片段,然后通过wami示例和服务器端控制器方法上传该文件。由于某种原因,request.bodyInputStream引发以下错误: java.io.IOException: Bad file descriptor at java.io.FileInputStream.readBytes(Native Method) at java.io.FileInputStream.read(FileInputStream.java:198) at co

我试图在浏览器端用录制一段声音片段,然后通过wami示例和服务器端控制器方法上传该文件。由于某种原因,
request.body
InputStream
引发以下错误:

java.io.IOException: Bad file descriptor
    at java.io.FileInputStream.readBytes(Native Method)
    at java.io.FileInputStream.read(FileInputStream.java:198)
    at controllers.APIVoicemailController.addNewRecording(APIVoicemailController.java:56)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:548)
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:502)
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:478)
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:473)
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161)
    at play.server.PlayHandler$NettyInvocation.execute(PlayHandler.java:256)
    at play.Invoker$Invocation.run(Invoker.java:276)
    at play.server.PlayHandler$NettyInvocation.run(PlayHandler.java:234)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:680)
路由
POST/upload

   public static void addNewRecording() {
        if (request.method.equals(Constants.METH_POST)) {
            try {
                InputStream inputStream = request.body;
                Map<String, Header> headerMap = request.headers;
                for (Entry<String, Header> entry : headerMap.entrySet()) {
                    Logger.info("Head: " + entry.getKey() + " name; "
                        + entry.getValue().name + " val: " + entry.getValue().value());
                }

                OutputStream out = new FileOutputStream(new File(
                    "/Users/franklovecchio/Desktop/file.mp3"));

                int read = 0;
                byte[] bytes = new byte[1024];

                            /* ERROR ON LINE BELOW */
                while ((read = inputStream.read(bytes)) != -1) {
                    out.write(bytes, 0, read);
                }

                inputStream.close();
                out.flush();
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

            for (Entry<String, String> params : request.params.allSimple().entrySet()) {
                Logger.info("k: " + params.getKey() + "v: " + params.getValue());
            }
            renderCustomMessage("Created new recording.", "Success.");
        }
    }
publicstaticvoid addNewRecording(){
if(request.method.equals(Constants.METH_POST)){
试一试{
InputStream InputStream=request.body;
Map headerMap=request.headers;
for(条目:headerMap.entrySet()){
Logger.info(“Head:”+entry.getKey()+“name;”
+entry.getValue().name+“val:+entry.getValue().value());
}
OutputStream out=新文件OutputStream(新文件(
“/Users/franklovecchio/Desktop/file.mp3”);
int read=0;
字节[]字节=新字节[1024];
/*下一行有错误*/
而((read=inputStream.read(bytes))!=-1){
输出。写入(字节,0,读取);
}
inputStream.close();
out.flush();
out.close();
}捕获(IOE异常){
e、 printStackTrace();
}
for(条目参数:request.params.allSimple().entrySet()){
Logger.info(“k:+params.getKey()+”v:+params.getValue());
}
RenderConstomessage(“创建了新录音”,“成功”);
}
}

如何解决这个问题?

我最近也做了同样的事情。以下步骤如下:

1.获取Wami的示例代码,该代码发布到record.php

2.将post url从record.php更改为与我的游戏控制器对应的url

3.在控制器内部,只保存接收到的数据而不检查标题。(可能这就是我在代码中看到的差异)。 使用firebug可以帮助您查看请求类型(无论它是否为audio/。)


数据包含在请求正文中,只需将其作为输入流读取并写入mp3就足够了。

我最近也做了同样的事情。以下步骤如下:

1.获取Wami的示例代码,该代码发布到record.php

2.将post url从record.php更改为与我的游戏控制器对应的url

3.在控制器内部,只保存接收到的数据而不检查标题。(可能这就是我在代码中看到的差异)。 使用firebug可以帮助您查看请求类型(无论它是否为audio/。)


数据包含在请求正文中,只需将其作为输入流读取并将其写入mp3就足够了。

我正在使用Play 2,但如果您只获取
输入流的内容,而不检查标题,则可以将其存储在WAV文件或DB中,而不会出现任何问题。

我正在使用Play 2,但是,如果您只获取
InputStream
的内容而不检查标题,那么您将能够毫无问题地将其存储在WAV文件或DB中