问题:我正在使用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<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?
答案 0 :(得分:18)
在我的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类型是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";
通过这种实现,我能够从资产和外部存储器中读取文件。