使用NanoHttpd在本地服务器上提供图像

时间:2015-06-08 13:59:23

标签: android nanohttpd

我需要创建一个能够提供设备本地文件的本地服务器。我找到了这个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

有人可以建议解决方案吗?提前谢谢。

5 个答案:

答案 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;
        }