当前位置: 首页 > 知识库问答 >
问题:

为什么Node.js的restful api没有从Java Android接收这个输出流?

微生毅
2023-03-14

我有一个类audio sender,它连接到nodejs服务器,并以POST方法模式上传音频文件。

public class AudioSender implements Callable<JSONObject> {

String outputFile;

AudioSender(String fileLocation){
    outputFile=fileLocation;
}

public JSONObject call(){
    URL url = null;
    HttpURLConnection urlConnection = null;
    InputStream audioInputStream=null;
    JSONObject response=null;
    byte buffer[]=new byte[16];
    try {
        url = new URL("http://192.168.0.106:3000/upload");
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } finally {
        try {
            urlConnection = (HttpURLConnection) url.openConnection();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            urlConnection.setDoOutput(true);
            urlConnection.setChunkedStreamingMode(16);
            urlConnection.setRequestProperty("Content-Type","multipart/form-data");
            urlConnection.setRequestProperty("Connection", "Keep-Alive");
            urlConnection.setRequestProperty("Cache-Control", "no-cache");
            urlConnection.setRequestProperty(
                    "Content-Type", "multipart/form-data;boundary=*****");
            try {
                OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
                try {
                    audioInputStream = new BufferedInputStream(new FileInputStream(outputFile));
                    Log.d("hello","audioinputstream");
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } finally {

                    while(audioInputStream.read(buffer)!=-1) {
                        out.write(buffer);
                        Log.d("buffer",buffer.toString());
                    }
                    try {
                        audioInputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                InputStream in = new BufferedInputStream(urlConnection.getInputStream());
                StringBuilder total = new StringBuilder();
                while(in.read(buffer)!=-1)
                    total.append(buffer);
                    Log.d("response",total.toString());
                try {
                    response = new JSONObject(total.toString());
                }catch(JSONException e){
                    Log.e("Response Parse Error", "Could not parse malformed JSON");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return response;
}

这是执行AudioSender Callable的上载。

public void upload() {
    JSONObject response=null;
    AudioSender sender=new AudioSender(outputFile);
    FutureTask<JSONObject> uploadTask=new FutureTask<JSONObject>(sender);
    ExecutorService executorService= Executors.newFixedThreadPool(1);
    executorService.execute(uploadTask);
    Log.d("s","was here");
    while(true){
        if(uploadTask.isDone()){
            try{
                response=uploadTask.get();
            }catch(InterruptedException|ExecutionException e){
                e.printStackTrace();
                Log.e("ee","ee",e.getCause());

            }
        }
    }
}

我很清楚这不是node JS的错误,但这里是服务器代码:app.post(“/upload”,function(req,res){console.log(“someone called!”);req.on(“data”,function(chunk){console.log(“res”);console.log(chunk);});req.on(“end”,function(){console.log(“done!”);res.send({“name”:“sg”});});

当我调用upload()时,服务器控制台将打印某人被调用!搞定了!

我在调试时发现,我确实收到了来自服务器的响应json对象。我不知道out.write(buffer)是否完成了这项工作,但是调试它显示buffer值正在改变,并且与我的音频文件的大小一致。

请不要建议使用离子或其他任何东西。

共有1个答案

白弘伟
2023-03-14

我通过如下方式设置URLConnection来解决这些问题:

            boundary = "===" + System.currentTimeMillis() + "===";
            urlConnection.setUseCaches(false);
            urlConnection.setDoOutput(true);    // indicates POST method
            urlConnection.setDoInput(true);
            urlConnection.setRequestProperty("Content-Type","multipart/form-data; boundary=" + boundary);
 类似资料:
  • 我尝试了一切,但图像不会显示出来,我试图使图像变小但没有用,我试图改变路径,我试图改变图像的位置但没有帮助,我试图在互联网上搜索但一无所获。 我看到的只是空白的图形用户界面,没有文本和图像。如果你能帮我,你会帮我一个大忙。 代码如下:

  • 因此,作为学校的一部分,我正在使用For循环,我有一些代码可以工作,但我很难理解为什么它可以工作。对我来说,重要的是要真正理解为什么一块代码能做它不能做的事情,而不仅仅是它能工作。 所以有一点背景。这个小程序利用for循环,根据用户输入打印一系列字符。其思想是用户输入一个介于1和8之间的数字,程序将打印一个字符,然后移动到下一行再打印两个,移动到下一行再打印三个等等,并打印用户输入的行数。 程序在

  • 我正在编写一个不和谐机器人,在私人服务器中使用,只是为了混日子。这是我第一次使用java。我正在使用不和谐JDA库来编码机器人。然而,我认为这不是主要问题。 对于如何从我创建的单独类中的特定方法中提取输出,我感到困惑。 我试图从一个名为Color.java的单独类中的公共String方法中拉出一个String到一个名为Commands.java.的文件中。 这是我的命令代码。JAVA这不是主文件,

  • 问题内容: 当我发现 Node.js是使用V8 JavaScript引擎构建的时 ,我想到: 太好了,因为网页将像在浏览器中一样呈现,并且具有支持XPath的“本机” DOM和在执行的页面上进行的任何AJAX调用,因此网页抓取将更加容易。 当它使用与Chrome相同的JavaScript引擎时,为什么没有本地DOM? 为什么它没有在已检索页面中运行JavaScript的模式? 我对JavaScri

  • 书上说这段代码在目录被glob匹配的情况下(如node_modules/fs.stat)应该报错,但是我在本地执行没有。 下面代码实现了一个copy的功能,将source directory下的所有文件复制到destination directory。 对这段代码的几点说明: 此处的glob版本为7.2.3,最新版本的glob是基于promise的,不再支持回调。 fs-extra提供了更多的功能

  • Code Demo 为什么这个React Demo的列表没有展示出来? this.setState 是一个异步操作? 所以导致log时 没有输出更新后的值? 那为什么页面没有重新渲染 ?