Почему изображения и файлы стилей не могут быть найдены в 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 header, Map parms,
           Map 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);
           }

НОТА : ЯПрочитайте эти вопросы (и ответы):Использование NanoHTTPD в Android ошибка загрузки файла nanohttpd Как создать сервер nanohttpd в Android?

Ответы на вопрос(1)

Решение Вопроса

в моем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 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 в JavaЯ просто проверяю несколько видов пантомимы.

Типы ссылочных пантомим - это статические поля в классе 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";

Благодаря этой реализации я смог читать файлы как из ресурсов, так и из внешней памяти.

 Eray14 июн. 2013 г., 10:02
Какова стоимостьHTTP_OK? (int) 200? и я'я получаюisStreaming cannot be resolved or is not a field ошибка.
 Redone02 окт. 2014 г., 14:30
Ссылка на полный исходный код будет полезна. Каждый раз, когда я получаюNot Found когда я подключаюсь к серверу из браузера. Не знаю, в чем проблема.
 Eray14 июн. 2013 г., 10:28
ты решил мою проблему! Спасибо. Просто нужно немного отредактировать, можно добавитьStatus HTTP_OK = Status.OK; , Еще раз спасибо
 MP2314 июн. 2013 г., 10:04
это также в классе NanoHTTPD 'HTTP_OK = "200 ОК ",
 MP2314 июн. 2013 г., 10:10
Может быть, вы используете другой метод или версию NanoHTTPD? Я использую это строковое поле. В соответствии с "isStreaming» Поле, я думаю, вы можете прокомментировать эту строку (или удалить), это было для некоторых специальных запросов, как я помню - я отредактирую свой ответ
 Eray14 июн. 2013 г., 10:08
Но это'не строка. Это'Тип, Статус. Я просто попробую это и, кажется, работает на данный моментStatus HTTP_OK = Status.OK; Также у меня есть еще одна проблема, вы можете проверить мое последнее изменение для моего первого комментария.
 Arun11 мая 2014 г., 14:33
Привет всем, я мог попробовать то же самое, чтобы сослаться на файл PNG, который я не могКто-нибудь, дайте мне знать, как изображение может быть передано в HTML-файл ... спасибо заранее за ваши ответы

Ваш ответ на вопрос