美文网首页
002.实战nanoHTTPD嵌入android app(3)

002.实战nanoHTTPD嵌入android app(3)

作者: tonytalks | 来源:发表于2018-04-28 10:47 被阅读0次

    这篇咱们来解决image显示的问题。


    6. 支持image

    看看2000年的网易,是多么的朴(chou)素(lou)。

    Image.png

    所以支持主流的image也是必须滴!

    有了上面的基础,其实加个图片也是个小case啦,也就是两个点:

    1. image的类型。从上面那个表,咱们可以看到这几个,只要把它们加到咱们的if else里去,这个问题就解决了:
    gif=image/gif
    jpg=image/jpeg
    jpeg=image/jpeg
    png=image/png
    
    1. 如何把image的内容返回

    这个问题我也不会,不过咱会谷歌。经过搜索在stackoverflow里找到这个答案,其实也异常的简单,因为nanoHTTPD有一个函数:

    public static Response newFixedLengthResponse(IStatus status, String mimeType, InputStream data, long totalBytes) {
        return new Response(status, mimeType, data, totalBytes);
    }
    

    有了这个,咱还怕啥,直接创建出一个InputStream给它,就能完成咱们的任务了:

    InputStream isr;
    
    try {
        isr = _mainContext.getAssets().open(filename);
        return newFixedLengthResponse(Response.Status.OK, mimetype, isr, isr.available());
    } catch (IOException e) {
        e.printStackTrace();
        return newFixedLengthResponse(Response.Status.OK, mimetype, "");
    }
    

    到这里咱们已经把一个http server要提供的基本功能都实现了。

    7. 总结一下

    经过这个小项目,咱们能看到开源的世界充满了各种好玩的东西,只要你能找得到。不过也会发现这些东西大多都是个半成品,比如官方的例子里就没有提供如何支持访问外部html,js,css,image这些的代码,都需要经过自己的手把它们改造成适合自己的代码。

    最后奉上MyServer全部代码:

    public Response serve(IHTTPSession session) {
        String uri = session.getUri();
        System.out.println("####MyWebServer:" + uri);
        String filename = uri.substring(1);
    
        if (uri.equals("/"))
            filename = "index.html";
    
        boolean is_ascii = true;
        String mimetype = "text/html";
        if (filename.contains(".html") || filename.contains(".htm")) {
            mimetype = "text/html";
            is_ascii = true;
        } else if (filename.contains(".js")) {
            mimetype = "text/javascript";
            is_ascii = true;
        } else if (filename.contains(".css")) {
            mimetype = "text/css";
            is_ascii = true;
        } else if (filename.contains(".gif")) {
            mimetype = "text/gif";
            is_ascii = false;
        } else if (filename.contains(".jpeg") || filename.contains(".jpg")) {
            mimetype = "text/jpeg";
            is_ascii = false;
        } else if (filename.contains(".png")) {
            mimetype = "image/png";
            is_ascii = false;
        } else {
            filename = "index.html";
            mimetype = "text/html";
        }
    
        if (is_ascii) {
            String response = "";
            String line = "";
            BufferedReader reader = null;
            try {
                reader = new BufferedReader(new InputStreamReader(_mainContext.getAssets().open(filename)));
    
                while ((line = reader.readLine()) != null) {
                    response += line;
                }
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return newFixedLengthResponse(Response.Status.OK, mimetype, response);
        } else {
            InputStream isr;
            try {
                isr = _mainContext.getAssets().open(filename);
                return newFixedLengthResponse(Response.Status.OK, mimetype, isr, isr.available());
            } catch (IOException e) {
                e.printStackTrace();
                return newFixedLengthResponse(Response.Status.OK, mimetype, "");
            }
        }
    }
    

    如果这篇文章对各位小伙伴有帮助,敬请拿去,不用客气。
    如果要转发,记得带上我的名字就好了。

    参考资料:

    http://programminglife.io/android-http-server-with-nanohttpd/
    https://github.com/NanoHttpd/nanohttpd/blob/master/core/src/main/resources/META-INF/nanohttpd/default-mimetypes.properties
    https://stackoverflow.com/questions/24390864/nanohttpd-in-android-serving-multiple-files-webpage

    相关文章

      网友评论

          本文标题:002.实战nanoHTTPD嵌入android app(3)

          本文链接:https://www.haomeiwen.com/subject/vaawlftx.html