Java接口实现文件上传

因工作需要,在后台管理页面加入一个上传文件的模块,虽然接口的代码很简单,但实现期间遇到了一些比较有趣的坑,特记录下来。

需求

实现文件上传,并提供一个可供下载的路径。

想法

文件上传代码暂且不谈,先说说文件放在服务器什么位置比较合适。我首先想到的是两个地方:

  1. tomcat的webapps/ROOT目录下,如果放在这个目录下,数量少了还好,一旦数量多了,必定会影响tomcat本身的运行速度。这个虽然可用但不可行。
  2. nginx的静态目录下,放在这个目录下则不会有什么影响。只需要在nginx中进行相应的配置即可。可用也可行。

java代码实现:

由于我们使用的是SSM框架,首先需要配置文件上传解析器。

<!-- 实例化部件解析器,解析二进制流,上传文件-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	<!-- 设置上传文件的最大值为20M 不能写20*1024*1024 -->
	<property name="maxUploadSize" value="20971520"></property>
	<!-- 设置上传文件的编码 -->
	<property name="defaultEncoding" value="utf-8"></property>
</bean>

虽然简单,但依旧遵从三层架构,Controller实现如下:


@Controller
@RequestMapping("/upload")
public class UploadApkController {

	@Resource
	private UploadApkService uploadApkService;

	/**
	 * 上传Apk文件
	 * @param file
	 * @return
	 */
	@RequestMapping("/uploadApk")
	@ResponseBody
	public Map<String, Object> uploadApk(@RequestParam("file") CommonsMultipartFile file){

		Map<String, Object> resultMap = new HashMap<>();
		try {
			uploadApkService.uploadApk(file);
			resultMap.put("msg", "上传成功");
		} catch (IOException e) {
			e.printStackTrace();
			resultMap.put("msg", "上传失败");
		}
		return resultMap;
	}

}

Service接口:


public interface UploadApkService {

    /**
     * 上传Apk文件
     * @param file
     * @throws IOException
     */
    public void uploadApk(CommonsMultipartFile file) throws IOException;
}

Service实现类:


public class UploadApkServiceImpl implements UploadApkService {

    /**
     * 上传Apk文件
     * @param file
     * @throws IOException
     */
    public void uploadApk(CommonsMultipartFile file) throws IOException {
    	//这是我的nginx静态路径,使用时需改为自己的对应路径
        String path="/data2/fphone/static/apk/"+file.getOriginalFilename();
        File newFile=new File(path);
        file.transferTo(newFile);
    }
}

代码部分完成。

对接口进行测试。

在这里插入图片描述
这是之前测试的截图,状态为OK即为上传成功。
下面进行下载测试,输入nginx静态地址,显示如下:
在这里插入图片描述
出现问题。思考后认为可能是权限不够,进入nginx静态目录下,执行命令:

ls -all apk

显示如下:
在这里插入图片描述
发现zrx.apk权限为640,对于其他人并没有读的权限。我nginx的配置如下:
在这里插入图片描述
所以通过nginx并没有读取这个文件的权限。有些人可能会说将nginx的user调整为root,但我建议不要给nginx太大的权限。所以采用另一种方式解决这个问题。

解决权限问题

既然不决定提高nginx的权限,那么只能将上传文件的权限由640改为644。查看tomcat的bin目录下的catalina.sh文件:
在这里插入图片描述
将这里的0027改为0022即可,0022代表权限为644。
权限修改完成,再次进行测试,调用接口上传文件,检查文件权限:

在这里插入图片描述
发现文件权限为644。继续尝试输入路径进行下载:
在这里插入图片描述
文件果然开始正常下载,验证了我们的思路是正确的。到此问题解决。如果有什么不明白或者发现问题的,欢迎评论或者私信我,谢谢各位!

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值