我是14年左右开始用的百度云,当时云的概念刚刚起来,我用过京东云(JAE),新浪云(SAE),百度云(BAE),其中我觉得SAE和BAE是做得比较不错的PaaS(平台即服务),我这篇,主要将百度文件上传问题,在BAE中,我们不可以直接获取到绝对路径,用户能操作的只有
/home/bae/app
和temp
连个文件夹了
这个是百度官方API上面的说明
文件上传后,目录结构
对于Java的项目,我们需要打包成ROOT.war 包来操作,其中在BAE 中,用户可以操作的目录是/home/bae/app/
下所有的数据,然而,我们将ROOT.war上传后,我们的应用名称,就编程了 app
上传后我们的目录结构就是,下面这个样子了
/home/bae/app
META-INF
resources
WEB-INF
index.jsp
上传文件到/home/bae/app
上传到网站的跟路径,session.getServletContext().getContextPath()
获取到当前项目的相对路径,然后和我们的/home/bae/app
拼接,就得到了静态文件的绝对路径。
String path = "/home/bae/app/"+session.getServletContext().getContextPath();
例子
这是以前的代码,采用的是SpringMVC的框架
@RequestMapping(value="/upload",method=RequestMethod.POST)
public String upload(MultipartFile file,HttpSession session,Model model) {
try {
//获取路径
//String path = session.getServletContext().getRealPath("/resources");
// System.out.println(path);
//上传到网站的跟路径
String path = "/home/bae/app/"+session.getServletContext().getContextPath();
String fileName = path+"/resources/"+file.getOriginalFilename();
FileUtils.copyInputStreamToFile(file.getInputStream(), new File(fileName));
System.out.println("上传路径名称\t"+fileName);
model.addAttribute("sysPath", fileName);
model.addAttribute("name",file.getOriginalFilename());
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
return "user/show";
}
图片访问
我们可以直接通过链接http://xxx/resource/xx.jpg
访问图片资源,xxx是我们自己的网站名称,resource/xx.jpg
是资源存放地址+文件名称
http://xxx/resource/xx.jpg
将文件上传到app目录下以后,当我们再次访问resource的jsp文件的时候,这个目录的静态文件将不能访问。
文件写入到temp目录
我们不能直接将文件写入到 app目录下,但是我们可以写入到temp目录后(也可以不写到temp目录下,直接操作MultipartFile,上传到别的服务器上 ),然后将图片传到别的服务器上,比如七牛云,或者是百度自己的BOS(对象存储中)
@RequestMapping(value="/upload2JAE",method=RequestMethod.POST)
public String upload2JAE(MultipartFile file,HttpSession session,Model model) {
try {
//获取路径
// String path = session.getServletContext().getRealPath("/resources");
// System.out.println(path);
//百度中可以操作的目录是 tmp 和 bae/app
String fileName = "/tmp/"+file.getOriginalFilename();
// 模仿我们在百度上的
// String fileName = "D:/tmp/"+file.getOriginalFilename();
//将数据写入到我们的硬盘中 temp 目录汇总
FileUtils.copyInputStreamToFile(file.getInputStream(), new File(fileName));
//新的文件
InputStream in = new FileInputStream(fileName);
String path = JAEUtils.upload(in,file.getSize(),file.getOriginalFilename());
System.out.println(path);
model.addAttribute("sysPath", fileName);
model.addAttribute("name",file.getOriginalFilename());
model.addAttribute("path", path);
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
return "user/show";
}