2013-06-14 2 views
4

ПРОБЛЕМА: Я использую NanoHTTPD. Он отлично работает, но он не служит .js файлам, изображениям и другим.Почему изображения и файлы стиля не удалось найти на NanoHTTPD

ПОДРОБНОЕ ОПИСАНИЕ: У меня есть папка 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?

ответ

17

в моем 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; 

      } 

Существует несколько не очень чистых решений с типом мимов. Проверка должна быть выполнена с помощью чего-то вроде этого Getting A File's Mime Type In Java, я простенький проект, я просто проверяю несколько видов мим.
типы Reference мим статические поля в классе 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"; 

С этой реализацией я был в состоянии читать файлы из активов, а также из внешней памяти.

+0

Каково значение 'HTTP_OK'? (int) 200? и я получаю 'isStreaming не может быть разрешен или не является полевой ошибкой. – Eray

+0

он также находится в классе NanoHTTPD 'HTTP_OK = "200 OK"', – MP23

+0

Но это не строка. Это тип, статус. Я просто пытаюсь это сделать и, похоже, сейчас работает 'Status HTTP_OK = Status.OK;' Также у меня есть еще одна проблема, вы можете проверить мое последнее изменение для моего первого комментария. – Eray

 Смежные вопросы

  • Нет связанных вопросов^_^