Why images and style files couldn't found on NanoHTTPD

后端 未结 1 1469
-上瘾入骨i
-上瘾入骨i 2020-12-30 16:35

PROBLEM : I\'m using NanoHTTPD . It\'s working great but it\'s not serving .js files, images and others.

DETAILED EXPLANATION : i

相关标签:
1条回答
  • 2020-12-30 17:10

    in my serve() method it looks like this:

                     @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;
    
                }
    

    There is some not so clean solution with mime types. Validation should be done with something like this Getting A File's Mime Type In Java, I my simple project I am just checking few kinds of mime.
    Reference mime types are static fields in NanoHTTPD class:

           /**
         * 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";
    

    With this implementation I was able to read files from assets as well as from external memory.

    0 讨论(0)
提交回复
热议问题