2015-06-08 3 views
1

Мне нужно создать локальный сервер, который сможет обслуживать локальные файлы устройства. Я нашел это library и, похоже, он способен удовлетворить мои потребности.Служить изображения на локальном сервере с помощью NanoHttpd

Я пробовал образец внутри этого проекта, и он отлично работает! Но он публикует .html-страницу, и мне нужны фотографии.

Я следил за этим post где .mp3 был подан. Но это не работает для меня. Вероятно, это потому, что библиотека была обновлена ​​с того времени.

@Override 
public Response serve(IHTTPSession session) { 

    FileInputStream fis = null; 
    try { 
     File file = new File(Environment.getExternalStoragePublicDirectory(ROOT) 
       + PATH + "picture.jpg"); //path exists and its correct 
     fis = new FileInputStream(file); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return new NanoHTTPD.Response(Response.Status.OK, "image/jpeg", fis, 1000000); //the last parameter is totalBytes. Not sure what to put there 
} 

Сервер запускается в OnCreate:

//start web server 
    try { 
     server = new WebServer(); 
     server.start(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

Цель состоит в том, чтобы получить доступ к файлам так: 192.168.1.2:8080/picture.jpg

Может кто-нибудь предложить решение? Заранее спасибо.

+0

Start с использованием методы, отличное обслуживание(). Один с ури и параметрами. Как в ссылке на эту почту, которую вы предоставили. Затем вы можете извлечь 'picture.jpg. первый или другие имена файлов. И вы не сказали, что именно не работает для вас. 'Спасибо заранее.' Очень неправильно. Вы должны пообещать поблагодарить, если вам помогут. – greenapps

+0

@greenapps, 'serve()' с параметрами устарел. Во всяком случае, я уже пробовал это. Любое из них не похоже на файлы сервисов. Я не могу получить к ним доступ по ip. На экране ничего не отображается – AnZ

+0

Ваш код должен быть в порядке, но удалите параметр: '1000000); // последний параметр totalBytes.' – greenapps

ответ

0

Так что я скачал previous version of NanoHttpd, и это сработало для меня. Вероятно, разработчики каким-то образом изменили поведение в новой версии. У меня не было времени разобраться в проблеме.

Это сработало для меня.

@Override 
public Response serve(String uri, Method method, Map<String, String> header, Map<String, String> parms, Map<String, String> files) { 
    FileInputStream fis = null; 
    try { 
     File file = new File(Environment.getExternalStoragePublicDirectory(ROOT) 
       + PATH + "picture.jpg"); 

     if (file.exists()){ 
      fis = new FileInputStream(file); 
      Log.d(TAG, "File exists: " + file.getAbsolutePath()); 
     } else { 
      Log.d(TAG, "File doesn't exist!"); 
     } 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    return new NanoHTTPD.Response(Response.Status.OK, "image/jpeg", fis); 
} 

Это не правильный ответ, так как он не решает проблему с новой версией.

1

попробовать это, если вы не знаете, общий размер файла, то вы должны дать -T

@Override 
public Response serve(IHTTPSession session) { 
    FileInputStream fis = null; 
    try { 
     File file = new File(Environment.getExternalStoragePublicDirectory(ROOT) 
      + PATH + "picture.jpg"); //path exists and its correct 
     fis = new FileInputStream(file); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return new NanoHTTPD.Response(Response.Status.OK, "image/jpeg", fis, -1); //the last parameter is totalBytes. Not sure what to put there 
} 

Edit: правильные параметры для ответа являются:

return new NanoHTTPD.Response(NanoHTTPD.Response.Status.OK, "image/jpeg", fis, file.length()); 

Последний параметр - размер FileInputStream.

1

Я очень рад ответам. Но, насколько я знаю, последний параметр - это размер файла (в (длинных) байтах). Таким образом, вы можете создать новое целое и инициализировать его внутри Ьгу блока, после инициализации ФИС, следующим образом:

size=fis.available(); // returns available size of file 

, а затем установить размер до последнего параметра.

+0

Это выглядит лучше, чем мое редактирование выше. Шерзодбек принимает размер fis; который является более правильным, чем размер файла. (Хотя это должно быть одинаково) –

0

В новой версии Ответ защищен.

Я использовал это, чтобы загрузить файл APK, я думаю, что это будет работать для изображений также:

File f = new File("apk/app-release.apk"); 
FileInputStream fis = new FileInputStream(f); 
Response res = newChunkedResponse(Response.Status.OK, "application/vnd.android.package-archive", fis); 
res.addHeader("Content-Disposition", "attachment; filename=\"" + f.getName() + "\""); 
return res;