谈谈存储系统
文件存储是开发中常常用到的。下面我将对如下存储系统进行说明:
一、阿里云OSS阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。其数据设计持久性不低于99.999999999%,服务设计可用性不低于99.99%。具有与平台无关的RESTful API接口,您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。 您可以使用阿里云提供的API、SDK接口或者OSS迁移工具轻松地将海量数据移入或移出阿里云OSS。数据存储到阿里云OSS以后,您可以选择标准类型(Standard)的阿里云OSS服务作为移动应用、大型网站、图片分享或热点音视频的主要存储方式,也可以选择成本更低、存储期限更长的低频访问类型(Infrequent Access)和归档类型(Archive)的阿里云OSS服务作为不经常访问数据的备份和归档。 使用步骤(均来自官方文档) 1.加入Maven依赖<dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>2.8.3</version> </dependency> 2.编写上传类import java.io.ByteArrayInputStream; java.io.File; java.io.FileInputStream; java.io.FileNotFoundException; java.io.InputStream; com.aliyun.oss.OSSClient; com.aliyun.oss.model.GetObjectRequest; public class UploadOSS { //上传文件(以上传图片为例) static void main(String[] args) throws Exception { Endpoint以杭州为例,其它Region请按实际情况填写。 String endpoint = "http://oss-cn-beijing.aliyuncs.com"; 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。 String accessKeyId = "访问密钥ID"; String accessKeySecret = "访问密钥"; String bucketName = "challenegertech"; String objectName="AdminLTE.PNG" 创建OSSClient实例。 OSSClient ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret); 上传文件流。 InputStream inputStream = new FileInputStream("C://Users//eluzhu//Pictures//AdminLTE.PNG"); ossClient.putObject(bucketName,objectName,inputStream); 关闭OSSClient。 ossClient.shutdown(); } } 或许有人问,不太明白上述参数是从那里获取到的,这里我建议去官方文档上面看,如下: 像腾讯云、百度云、七牛云等存储系统,其实和阿里云相差并不大,都可以用。我公司其中一个项目用到的存储系统就是腾讯云。像我之前研究的一个jeesite开源项目,其存储系统主要用的是七牛云。 关于腾讯云、百度云、七牛云详细对比,感兴趣的可以参考这篇文章腾讯云、七牛云、阿里云存储对比 二、ftp由于我主要参考wordpress,所以关于存储那块,我也准备采用ftp的方式。 关于Java当中如何使用FTP上传下载文件,大家可以参考如下步骤: 1.添加maven依赖<dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.3</version> </dependency> 2.添加配置类(主要是ftp配置相关信息)package com.blog.springboot.config; FtpConfig { private int port; ftp端口 private String ftpLoginName; ftp服务器登录账户 private String ftpLoginPwd; ftp服务器登录密码 private String hostName; ftp主机ip private String basePath; ftp文件基础路径 private String baseImgUrl; ftp前端界面图片访问路径 public String getBasePath() { return basePath; } void setBasePath(String basePath) { this.basePath = String getBaseImgUrl() { baseImgUrl; } setBaseImgUrl(String baseImgUrl) { this.baseImgUrl =int getPort() { port; } void setPort( port) { this.port = String getFtpLoginName() { ftpLoginName; } setFtpLoginName(String ftpLoginName) { this.ftpLoginName = String getFtpLoginPwd() { ftpLoginPwd; } setFtpLoginPwd(String ftpLoginPwd) { this.ftpLoginPwd = String getHostName() { hostName; } setHostName(String hostName) { this.hostName = hostName; } } 3.添加工具类并编写main方法测试com.blog.springboot.utils; java.io.FileOutputStream; java.io.IOException; java.io.InputStream; java.io.OutputStream; java.net.SocketException; java.util.UUID; org.apache.commons.net.ftp.FTP; org.apache.commons.net.ftp.FTPClient; org.apache.commons.net.ftp.FTPFile; org.apache.commons.net.ftp.FTPReply; com.blog.springboot.controller.AbstractController; class FtpUtils extends AbstractController{ FTPClient ftpClient= FTPClient(); /** * * @param hostName ftp服务器主机名ip * port ftp服务器连接断口 * loginName ftp服务器登录名 * loginPwd ftp服务器登录密码 */ void FtpLogin(String hostName, port,String loginName,String loginPwd){ try { ftpClient.connect(hostName,port); ftpClient.login(loginName,loginPwd); int reply=ftpClient.getReplyCode(); 判断ftp是否正确连接,返回状态码值在200~300之间表示正确连接 logger.info("reply:"+reply); if(!FTPReply.isPositiveCompletion(reply)){ ftpClient.disconnect(); } } catch (SocketException e) { logger.error("socket错误:",e); } (IOException e) { logger.error("io错误:" * 断开ftp连接 closeConnection(){ if(ftpClient.isConnected()){ { ftpClient.disconnect(); } (IOException e) { logger.error("io错误:" * 修改文件名为uuid开头避免文件名重复 * fileName 获取上传的文件名 * @return 新的文件名 String getFileSuffName(String fileName){ File file= File(fileName); String oldFileName=file.getName(); String suffixFileName=oldFileName.substring(oldFileName.lastIndexOf(".")+1); String uuid=UUID.randomUUID().toString().replace("-",""); String newFileName=uuid+"."+suffixFileName; newFileName; } * 上传文件 * filePath 文件路径,如 2019/02/23 * basePath 基础路径 /home/ftpUpFile/ * is 文件流 * fileName 文件名称 * @return boolean uploadFile(String filePath,String basePath,InputStream is,String fileName){ boolean flag=false { if(!ftpClient.changeWorkingDirectory(basePath+filePath)){ String[] dirs=filePath.split("/"); String tempPath=basePath; for(String dir:dirs){ if(null==dir || "".equals(dir))continue; tempPath+="/"+dir; ftpClient.changeWorkingDirectory(tempPath)){ ftpClient.makeDirectory(tempPath)){ flag; }else{ ftpClient.changeWorkingDirectory(tempPath); } } } } ftpClient.setFileType(FTP.BINARY_FILE_TYPE);设置文件为二进制流 if(!ftpClient.storeFile(fileName,is)){ 上传文件 flag; } is.close(); ftpClient.logout(); flag=true; } finally{ closeConnection(); } flag; } * Description: 从FTP服务器下载文件 * host FTP服务器hostname * port FTP服务器端口 * username FTP登录账号 * password FTP登录密码 * remotePath FTP服务器上的相对路径 * fileName 要下载的文件名 * localPath 下载后保存到本地的路径 * public downloadFile(String remotePath,String fileName,String localPath) { boolean result = { ftpClient.changeWorkingDirectory(remotePath); 转移到FTP服务器目录 FTPFile[] files = ftpClient.listFiles(); (FTPFile ff : files) { (ff.getName().equals(fileName)) { File localFile = new File(localPath + "/" + ff.getName()); OutputStream is = FileOutputStream(localFile); ftpClient.retrieveFile(ff.getName(),is); is.close(); } } ftpClient.logout(); result = (IOException e) { e.printStackTrace(); } { closeConnection(); } result; } FileNotFoundException { FtpUtils f = FtpUtils(); f.FtpLogin("192.168.126.130",21,"ftp","ftp."); FileInputStream in=new FileInputStream(new File("C://Users//test//Downloads//AdminLTE.PNG")); f.uploadFile("image","/home/ftpuser/ftp",in,"AdminLTE.PNG"); } } 三、Java常规存储常规存储,一般情况是存在tomcat某个文件夹下,或者是将文件以流的形式写入数据库对应的表中(通常不建议这么做,极大的损耗数据库的I/O流和存储容量)。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |