NanoHTTPD建服务端遇到前端<input type=‘file‘>文件传输及乱码解决

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());
    	....//接着原来写
    }

猜你喜欢

转载自blog.csdn.net/weixin_42404974/article/details/107742132