18623


eclipseを使ってAndroidアプリを作っています。NanoHTTPD.javaを使ってhttpアクセスがあると、バイナリデータを応答するようにしたいと思っています。  
assetsフォルダには"abc.bin"ファイル(バイナリデータ)があります。このファイルを応答したいのです。

[code]

    private class MyHTTPD extends NanoHTTPD {
        public MyHTTPD() throws IOException {
            super(PORT, null);
        }
        @Override
        public Response serve(String uri, String method, Properties header,
                Properties parms, Properties files) {
            InputStream is = null;
            BufferedReader br = null;
            String key = "";
    
            try {
                try {
                    is = getAssets().open("abc.bin");
                    br = new BufferedReader(new InputStreamReader(is));
    
                    String str;
                    while ((str = br.readLine()) != null) {
                        key += str;
                    }
                } finally {
                    if (is != null)
                        is.close();
                    if (br != null)
                        br.close();
                }
            } catch (Exception e) {
                Log.d("test", "abc.binが読み込めません。");
            }
            return new NanoHTTPD.Response(HTTP_OK, MIME_DEFAULT_BINARY, key);
    }
    }
    
[/code]

しかし、バイナリはそのまま配信されず変換されているようです。  
Stringの変数にしているからでしょうか。またバイナリをhttp応答するにはどうしたらいいのでしょうか。

よろしくお願いします。


CC BY-SA 3.0
2015-11-10T09:01:11.303
18618
2015-11-11T02:11:45.553
2015-11-11T02:11:45.553
8593
8593
question
android nanohttpd
NanoHTTPDを使ってバイナリの応答


当てずっぽうですが `br.readLine()` で文字列に変換されてるように思えます。  
加えてバイナリなのに1行読み込みというのも違和感があります。

[GitHub](https://github.com/elonen/nanohttpd/blob/master/core/src/main/java/fi/iki/elonen/NanoHTTPD.java)のソースを見ると
3つ目に InputStream を受ける形があるので これを使えないでしょうか。

[code]

        /**
         * Default constructor: response = HTTP_OK, mime = MIME_HTML and your supplied message
         */
        public Response(String msg) {
            this(Status.OK, MIME_HTML, msg);
        }
    
        /**
         * Basic constructor.
         */
        public Response(IStatus status, String mimeType, InputStream data) {
            this.status = status;
            this.mimeType = mimeType;
            this.data = data;
        }
    
        /**
         * Convenience method that makes an InputStream out of given text.
         */
        public Response(IStatus status, String mimeType, String txt) {
            this.status = status;
            this.mimeType = mimeType;
            try {
                this.data = txt != null ? new ByteArrayInputStream(txt.getBytes("UTF-8")) : null;
            } catch (java.io.UnsupportedEncodingException uee) {
                uee.printStackTrace();
            }
        }
    
[/code]

なので、`Response` のコンストラクタに `key` の代わりに `is` を渡して見て下さい。

[code]

        return new NanoHTTPD.Response(HTTP_OK, MIME_DEFAULT_BINARY, is);
    
[/code]


CC BY-SA 3.0
2015-11-10T10:56:30.910
18623
2015-11-10T10:56:30.910
5008
18618
answer