NanoHTTPD建服务端遇到前端上传文件例如:
<input type='file' ........>
这时候表单提交需要使用multipart/form-data,例如:
<form method="post" enctype="multipart/form-data">
<label for="file">upload</label>
<input type="file" id="file" name="file">
<input type="submit" value="anything">
</form>
根据前端例子后端要获取这文件的方式是,在NanoHTTPD重写的serve方法中如下处理:
@Override
public Response serve(IHTTPSession session) {
....//省略
Method method = session.getMethod();
Map<String, String> files = new HashMap<>();
Map<String, String> params = session.getParms();
...//省略其他业务流程
if (Method.POST.equals(method)){
try{
session.parseBody(files);
} catch (Exception e) {
e.printStackTrace();
}
params = session.getParms();
//获取文件的核心
final String filePath = files.get("file");
final File file = new File(filePath);
//文件名获取
String filename = params.get("file");
//这里的filename其实是前端的一个路径,比如D:\filename.png
//todo 字符串处理获取真的filename
...//省略业务逻辑
}
上面简单写了一下获取NanoHTTPD服务端怎么获取文件,filename获取方式很多文章用的解析头,因为如果NanoHTTPD,你用上面我们获取的file对象的getname方法获取的是一个NanoHTTPDXXXXXXXXXXX的文件名,但是在头里面有存文件名,个人觉得这个方法太复杂。
上面例子里的核心语句files.get(“file”)里面的file跟input里面的name=‘file’对应。
按理上面已经完成了整个前端上传,后端获取的流程。但是如果你的文件路径包括文件名中出现中文,因为enctype=“multipart/form-data”,前端没有编码后端获取中文是一个乱码。
这里提供一个乱码的解决方案,也是来源于网络。
首先前端指定编码方式为utf-8,可以再meta指定,也可以再form中指定。
后端写法:
@Override
public Response serve(IHTTPSession session) {
//add
ContentType ct = new ContentType(session.getHeaders().get("content-type")).tryUTF8();
session.getHeaders().put("content-type", ct.getContentTypeHeader());
....//接着原来写
}