我需要创建一个能够提供设备本地文件的本地服务器。我找到了这个library,似乎能够满足我的需求。
我在这个项目中尝试了样本,它运行正常!但它发布.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 :(得分: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
}
编辑: 响应的正确参数是:
return new NanoHTTPD.Response(NanoHTTPD.Response.Status.OK, "image/jpeg", fis, file.length());
最后一个参数是FileInputStream.
答案 1 :(得分:1)
我对答案感到非常兴奋。但是,据我所知,最后一个参数是文件大小(以(长)字节为单位)。因此,您可以在初始化fis之后创建新的整数并在try块内初始化它,如下所示:
size=fis.available(); // returns available size of file
然后将size设置为最后一个参数。
答案 2 :(得分:1)
在新版本中响应受到保护。
我用这个来下载一个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;
答案 3 :(得分: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);
}
这实际上不是正确的答案,因为它没有解决新版本的问题。
答案 4 :(得分:0)
如果您使用的是NanoHTTPD版本2.3.1+,则语法有所更改。您可以使用newFixedLengthResponse(...)
@Override
public Response serve(IHTTPSession session) {
switch (session.getUri()) {
case "/config.png": {
try {
FileInputStream fis = context.openFileInput("config.png");
return newFixedLengthResponse(Status.OK, "image/png", fis, fis.available());
} catch (IOException e) {
e.printStackTrace();
}
return null;
}