4

问题:我正在使用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?

4

1 回答 1

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。
引用 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";

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

于 2013-06-14T07:48:58.367 回答