简体   繁体   English

为什么我的node.js restful api无法从Java Android接收此输出流?

[英]Why isn't my node.js restful api recieving this output stream from Java Android?

I have a class audio sender which makes a connection to the nodejs server and uploads an audio file in POST method mode. 我有一个类音频发送器,它连接到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;
}

This is the upload that executes the AudioSender callable. 这是执行AudioSender可调用的上载。

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());

            }
        }
    }
}

I pretty much know this isn't node js's fault but here's the server code: 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'}); });}); 我几乎知道这不是节点js的错,但这是服务器代码:app.post('/ upload',function(req,res){console.log(“有人叫!”); req.on('data ',function(chunk){console.log('res'); console.log(chunk);}); req.on('end',function(){console.log(“ done!”)); res。 send({'name':'sg'});});});

When I call upload(), the server console prints someone called! 当我调用upload()时,服务器控制台将打印一个叫! done! 完成!

I was debugging and found that indeed I am receiving the responded json object from the server. 我正在调试,发现确实从服务器接收到响应的json对象。 And I don't know if out.write(buffer) is doing the job, but debugging it shows that the buffer value is changing and is in par with my audio file's size. 而且我不知道out.write(buffer)是否在做这项工作,但是调试它表明缓冲区的值正在变化并且与我的音频文件的大小相等。

Please do not suggest using ION or anything else. 请不要建议使用ION或其他任何方式。

I solved the problems by setting up the URLConnection as follows: 我通过如下设置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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM