SSM+Oracle实现文件上传访问系统
——Javee
此系统功能很简单,用户进入我们的系统之后,点击上传文件,然后系统处理之后给出文件的访问链接。
那么有小伙伴会问了,这么简单的功能有什么用呢?其实这个系统主要是为了方便前端人员开发使用,前端开发往往需要大量的图片素材和文件,当前端人员将这些文件和代码打包后,整个项目会变得非常大,那么前端开发人员将图片或者文件上传到这个系统,我们提供文件访问链接,开发人员引用我们提供的链接就可以正常使用文件。
整个系统是第一版本,功能什么的都比较简单,使用效果如下图:
刚进入我们的系统,为如下界面:
点击上传图片,选择要上传的文件或者图片:
点击确定之后,就会出现如下界面,在界面显示出了我们刚才选择的文件:
点击上传,文件就会存到我们的服务器上,然后提供给用户访问链接和使用示例及效果展示图:
整个项目实现并不难,主要是文件的上传和传输到浏览器。
文件上传实现代码如下:
@PostMapping("/upload.action")
public ModelAndView upload(MultipartFile file) throws IOException {
String fileName = file.getOriginalFilename();
System.out.println(fileName);
//将上传的文件存入本地
String fileUniqueName = UUID.randomUUID().toString().replaceAll("-","");
fileUniqueName += fileName.substring(fileName.lastIndexOf("."));
File fileNew = new File("f:" + File.separator + "imgFile" + File.separator + fileUniqueName);
fileNew.createNewFile();
file.transferTo(fileNew);
// 获取本地ip
InetAddress ia = null;
ia = ia.getLocalHost();
String localAddress = ia.getHostAddress();
String str = "http://" + localAddress + ":8080/file/image.action?imgPath=" + fileUniqueName;
ModelAndView modelAndView = new ModelAndView("redirect:/page/success.html?address=" + str);
Img img = new Img();
img.setImgPath(fileUniqueName);
imgService.save(img);
return modelAndView;
}
这段代码是实现文件上传到服务器之后,服务器对文件的存储及链接的生成并将链接返回给前端。
用户通过访问链接调用文件的实现代码如下:
@RequestMapping("/image.action")
public void getImage(String imgPath, HttpServletResponse response) {
File file = new File("f:/imgFile/" + imgPath);
if(!file.exists()) return;
byte[] data = new byte[1024 * 1024];
try(InputStream is = new FileInputStream(file);
ServletOutputStream os = response.getOutputStream();) {
// 告诉浏览器准备下载,并赋予下载文件的名字
response.setHeader("Content-Disposition", "attachment;");
// 告诉浏览器, 我不是响应页面, 而是响应一个二进制数据(流)
response.setContentType("application/octet-stream");
int len = 0;
while((len = is.read(data)) != -1) {
os.write(data, 0, len);
}
} catch (Exception e) {e.printStackTrace();}
}
看完了后端的实现代码,是不是觉得其实很简单?
这个系统在实现过程中有一个问题,就是用户上传的文件是如何在数据库中保存的?
看完了代码发现其实并不难,我们的实现思路就是将用户上传的文件存入服务器的一个固定文件夹下面,然后将文件名存入数据库即可。
那么,肯定又有人要问了,你既然将文件名存入数据库,那么用户上传的文件如果出现两个文件名相同怎么办?
这个问题,看了第一段代码也不难知道,我其实是对用户上传的文件名修改了的,使用的是UUID作为文件名,这个UUID是通过当前时间和电脑当前状态生成的全世界唯一的代码,不可能重复。
源码见主页我的下载:SSM+Oracle实现文件上传访问系统v1.0 或 我的Github
后面持续更新功能~