为什么在NanoHTTPD上找不到图像和样式文件

时间:2013-06-14 07:08:31

标签: android nanohttpd

问题:我正在使用NanoHTTPD。它运行良好,但它不提供.js文件,图像和其他。

详细说明:我在资产文件夹中有一个pages文件夹。此文件夹包含index.html,css文件,图像等。我正在使用像这样的NanoHTTPD,但是当我浏览浏览器时,没有任何样式或图像。服务器无法找到图像和其他文件。只有index.html文件的内容。 活动:

MyHTTPD server = null;
        try {
            server = new MyHTTPD(getApplicationContext());
            try
               {
                   server.start();
               }
               catch( IOException ioe )
               {
                   System.err.println( "Couldn't start server:\n" + ioe );
                   System.exit( -1 );
               }
               System.out.println( "Listening on port 8080. Hit Enter to stop.\n" );
               try { System.in.read(); } catch( Throwable t ) {
                   System.out.println("read error");
               };
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

MyHTTPD类

public Context ctx = null;
    /**
    * Constructs an HTTP server on given port.
    */
   public MyHTTPD(Context ctx) throws IOException {
       super(8080);
       this.ctx = ctx;
   }


@Override
   public Response serve( String uri, Method method,
           Map<String, String> header, Map<String, String> parms,
           Map<String, String> files )
           {
            String html = null;
            InputStream is = null;
            try {
                is = ctx.getAssets().open("pages/index.html");
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            byte[] b;
            try {
                b = new byte[is.available()];
                is.read(b);
                html = new String(b);
            } catch (IOException e) { // TODO Auto-generated catch block
                e.printStackTrace();
            }
               return new NanoHTTPD.Response(html);
           }

注意:我已经阅读了这些问题(和答案): Using NanoHTTPD in Android file uploading error nanohttpd How to create nanohttpd server in android?

1 个答案:

答案 0 :(得分:18)

在我的serve()方法中,它看起来像这样:

                 @Override
            public Response serve(String uri, String method, Properties header, Properties parms, Properties files) {
                       Log.d(TAG,"SERVE ::  URI "+uri);
              final StringBuilder buf = new StringBuilder();
              for (Entry<Object, Object> kv : header.entrySet())
                buf.append(kv.getKey() + " : " + kv.getValue() + "\n");
              InputStream mbuffer = null;



                            try { 
                                    if(uri!=null){

                                       if(uri.contains(".js")){
                                               mbuffer = mContext.getAssets().open(uri.substring(1));
                                               return new NanoHTTPD.Response(HTTP_OK, MIME_JS, mbuffer);
                                       }else if(uri.contains(".css")){
                                               mbuffer = mContext.getAssets().open(uri.substring(1));
                                               return new NanoHTTPD.Response(HTTP_OK, MIME_CSS, mbuffer);

                                       }else if(uri.contains(".png")){
                                               mbuffer = mContext.getAssets().open(uri.substring(1));      
                                               // HTTP_OK = "200 OK" or HTTP_OK = Status.OK;(check comments)
                                               return new NanoHTTPD.Response(HTTP_OK, MIME_PNG, mbuffer);
                                       }else if (uri.contains("/mnt/sdcard")){
                                               Log.d(TAG,"request for media on sdCard "+uri);
                                               File request = new File(uri);
                                               mbuffer = new FileInputStream(request);
                                               FileNameMap fileNameMap = URLConnection.getFileNameMap();
                                               String mimeType = fileNameMap.getContentTypeFor(uri);

                                               Response streamResponse = new Response(HTTP_OK, mimeType, mbuffer);
                                               Random rnd = new Random();
                                String etag = Integer.toHexString( rnd.nextInt() );
                                streamResponse.addHeader( "ETag", etag);
                                               streamResponse.addHeader( "Connection", "Keep-alive");






                                               return streamResponse;
                                       }else{
                                               mbuffer = mContext.getAssets().open("index.html");
                                               return new NanoHTTPD.Response(HTTP_OK, MIME_HTML, mbuffer);
                                       }
                                    }

                            } catch (IOException e) {
                                    Log.d(TAG,"Error opening file"+uri.substring(1));
                                    e.printStackTrace();
                            }

                      return null;

            }

有一些不太清晰的mime类型的解决方案。验证应该用这样的Getting A File's Mime Type In Java完成,我的简单项目我只是检查几种哑剧。
参考mime类型是NanoHTTPD类中的静态字段:

       /**
     * Common mime types for dynamic content
     */
    public static final String
            MIME_PLAINTEXT = "text/plain",
            MIME_HTML = "text/html",
            MIME_JS = "application/javascript",
            MIME_CSS = "text/css",
            MIME_PNG = "image/png",
            MIME_DEFAULT_BINARY = "application/octet-stream",
            MIME_XML = "text/xml";

通过这种实现,我能够从资产和外部存储器中读取文件。