为了工作,在后台管理页面中加入了上传文件的模块,接口的代码很简单,但在实现中遇到了有趣的漏洞。 特别记录。
需求
实现文件上传,提供可下载的路径。
创意
暂且不谈上传文件的代码,请告诉我把文件放在服务器的哪里比较合适。 我首先想到的是两个地方:
放在tomcat的webapps/ROOT目录下,放在这个目录下,数量少也没关系。 数量越多,总是会影响tomcat本身的运行速度。 这个可以用,但不能实行。 放在nginx静态目录下,放在此目录下没有任何影响。 在nginx上进行适当的构成即可。 可以使用。
java代码实现:
因为使用的是SSM框架,所以首先需要配置文件上传解析器。
虽然很简单,但它符合三层体系结构,Controller实现如下:
@Controller
@请求映射(/upload ) )。
publicclassuploadapkcontroller {
@Resource
私有代理服务;
//*
上传Apk文件
* @param file
* @return
*/
@请求映射(/upload apk ) )。
@响应主体
publicmapuploadapk (@ request param (file ) ) CommonsMultipartFile file ) {
Map resultMap=new HashMap (;
try {
uploadapkservice.upload apk (文件;
resultmap.put(‘msg ‘,’上传成功’);
}catch(ioexceptione ) {
e .打印堆栈跟踪(;
resultmap.put(‘msg ‘,’上传失败’);
}
返回结果映射;
}
}
服务接口:
publicinterfaceuploadapkservice {
//*
上传Apk文件
* @param file
* @throws IOException
*/
公共多参数文件(publicvoiduploadapk ) throws IOException;
}
服务实现类:
publicclassuploadapkserviceimplimplementsuploadapkservice {
//*
上传Apk文件
* @param file
* @throws IOException
*/
公共多参数文件(publicvoiduploadapk ) throws IOException { )。
//这是我的nginx静态路径,使用时需要更改为自己对应的路径
string path=’/data2/f phone/static/apk/’ file.getoriginalfilename (;
filenew file=new file (路径;
file.Transferto(newfile );
}
}
代码部分完成。
测试接口。
这是上一个测试的屏幕截图,如果状态为OK,则上传成功。 进行下载测试并输入nginx静态地址后,显示如下。 发生了问题。 考虑后,觉得权限可能不够,进入nginx静态目录下运行命令:
ls -all apk
显示如下。 发现zrx.apk权限为640,其他人无权阅读。 我的nginx配置如下。 因此,您没有权限通过nginx读取此文件。 虽然有些人可能会说要将nginx用户调整为root,但我建议不要授予nginx太多权限。 所以用别的方法解决这个问题。
解决权限问题
既然不决定提高nginx的权限,就只能将上传文件的权限从640更改为644。 检查tomcat的dbdjd目录中的catalina.sh文件。 把这里的0027改成0022就可以了。 0022表示644个权限。 权限修改完成,再次进行测试,调用接口上传文件,检查文件权限。
发现文件权限为644。 尝试输入路径继续下载。 文件还是开始正常下载,验证了我们的想法是正确的。 直到这个问题解决为止。 如果有什么不明白或发现问题,欢迎评论或私信。 非常感谢。