gpt4 book ai didi

android - 为什么在 NanoHTTPD 上找不到图像和样式文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:36:17 25 4
gpt4 key购买 nike

问题:我正在使用 NanoHTTPD .它运行良好,但不提供 .js 文件、图像和其他内容。

详细说明:我在 assets 文件夹中有一个 pages 文件夹。此文件夹包含 index.html、css 文件、图像和其他内容。我正在像这样使用 NanoHTTPD,但是当我使用浏览器浏览时,没有任何样式或图像。服务器找不到图像和其他文件。只有 index.html 文件的内容。 Activity :

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?

最佳答案

在我的 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;

}

对于 MIME 类型,有一些不太干净的解决方案。应该使用类似这样的方式进行验证 Getting A File's Mime Type In Java ,我的简单项目我只是检查几种 mime。
引用 mime 类型是 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";

通过这个实现,我能够从 Assets 和外部存储器中读取文件。

关于android - 为什么在 NanoHTTPD 上找不到图像和样式文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17102954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com