文件存儲是開發中經常用到的。下面我將對以下存儲系統進行說明:html
阿里雲對象存儲服務(Object Storage Service,簡稱 OSS),是阿里雲提供的海量、安全、低成本、高可靠的雲存儲服務。其數據設計持久性不低於99.999999999%,服務設計可用性不低於99.99%。具備與平臺無關的RESTful API接口,您能夠在任何應用、任什麼時候間、任何地點存儲和訪問任意類型的數據。前端
您可使用阿里雲提供的API、SDK接口或者OSS遷移工具輕鬆地將海量數據移入或移出阿里雲OSS。數據存儲到阿里雲OSS之後,您能夠選擇標準類型(Standard)的阿里雲OSS服務做爲移動應用、大型網站、圖片分享或熱點音視頻的主要存儲方式,也能夠選擇成本更低、存儲期限更長的低頻訪問類型(Infrequent Access)和歸檔類型(Archive)的阿里雲OSS服務做爲不常常訪問數據的備份和歸檔。
(引自官方文檔,官方文檔可參考:https://help.aliyun.com/video_detail/39708.html?spm=5176.10695662.1996646101.searchclickresult.6ce04d08gnXv2N)java
使用步驟(均來自官方文檔)spring
<dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>2.8.3</version> </dependency>
import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import com.aliyun.oss.OSSClient; import com.aliyun.oss.model.GetObjectRequest; public class UploadOSS { //上傳文件(以上傳圖片爲例) public 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(); } }
或許有人問,不太明白上述參數是從那裏獲取到的,這裏我建議去官方文檔上面看,以下:
https://help.aliyun.com/video_detail/39708.html?spm=5176.10695662.1996646101.searchclickresult.6ce04d08gnXv2N數據庫
像騰訊雲、百度雲、七牛雲等存儲系統,其實和阿里雲相差並不大,均可以用。我公司其中一個項目用到的存儲系統就是騰訊雲。像我以前研究的一個jeesite開源項目,其存儲系統主要用的是七牛雲。apache
關於騰訊雲、百度雲、七牛雲詳細對比,感興趣的能夠參考這篇文章騰訊雲、七牛雲、阿里雲存儲對比tomcat
因爲我主要參考wordpress,因此關於存儲那塊,我也準備採用ftp的方式。
關於FTP服務搭建能夠參考以下文章:
FTP服務搭建(以CentOS7爲例)
FTP服務搭建(以Ubuntu16.04爲例)安全
關於Java當中如何使用FTP上傳下載文件,你們能夠參考以下步驟:springboot
<dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.3</version> </dependency>
package com.blog.springboot.config; public class 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; } public void setBasePath(String basePath) { this.basePath = basePath; } public String getBaseImgUrl() { return baseImgUrl; } public void setBaseImgUrl(String baseImgUrl) { this.baseImgUrl = baseImgUrl; } public int getPort() { return port; } public void setPort(int port) { this.port = port; } public String getFtpLoginName() { return ftpLoginName; } public void setFtpLoginName(String ftpLoginName) { this.ftpLoginName = ftpLoginName; } public String getFtpLoginPwd() { return ftpLoginPwd; } public void setFtpLoginPwd(String ftpLoginPwd) { this.ftpLoginPwd = ftpLoginPwd; } public String getHostName() { return hostName; } public void setHostName(String hostName) { this.hostName = hostName; } }
package com.blog.springboot.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.SocketException; import java.util.UUID; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; import com.blog.springboot.controller.AbstractController; public class FtpUtils extends AbstractController{ FTPClient ftpClient=new FTPClient(); /** * * @param hostName ftp服務器主機名ip * @param port ftp服務器鏈接斷口 * @param loginName ftp服務器登陸名 * @param loginPwd ftp服務器登陸密碼 */ public void FtpLogin(String hostName,int 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); } catch (IOException e) { logger.error("io錯誤:",e); } } /** * 斷開ftp鏈接 */ public void closeConnection(){ if(ftpClient.isConnected()){ try { ftpClient.disconnect(); } catch (IOException e) { logger.error("io錯誤:",e); } } } /** * 修改文件名爲uuid開頭避免文件名重複 * @param fileName 獲取上傳的文件名 * @return 新的文件名 */ public String getFileSuffName(String fileName){ File file=new File(fileName); String oldFileName=file.getName(); String suffixFileName=oldFileName.substring(oldFileName.lastIndexOf(".")+1); String uuid=UUID.randomUUID().toString().replace("-",""); String newFileName=uuid+"."+suffixFileName; return newFileName; } /** * 上傳文件 * @param filePath 文件路徑,如 2019/02/23 * @param basePath 基礎路徑 /home/ftpUpFile/ * @param is 文件流 * @param fileName 文件名稱 * @return */ public boolean uploadFile(String filePath,String basePath,InputStream is,String fileName){ boolean flag=false; try { if(!ftpClient.changeWorkingDirectory(basePath+filePath)){ String[] dirs=filePath.split("/"); String tempPath=basePath; for(String dir:dirs){ if(null==dir || "".equals(dir))continue; tempPath+="/"+dir; if(!ftpClient.changeWorkingDirectory(tempPath)){ if(!ftpClient.makeDirectory(tempPath)){ return flag; }else{ ftpClient.changeWorkingDirectory(tempPath); } } } } ftpClient.setFileType(FTP.BINARY_FILE_TYPE);//設置文件爲二進制流 if(!ftpClient.storeFile(fileName, is)){ //上傳文件 return flag; } is.close(); ftpClient.logout(); flag=true; } catch (IOException e) { logger.error("io錯誤:",e); }finally{ closeConnection(); } return flag; } /** * Description: 從FTP服務器下載文件 * @param host FTP服務器hostname * @param port FTP服務器端口 * @param username FTP登陸帳號 * @param password FTP登陸密碼 * @param remotePath FTP服務器上的相對路徑 * @param fileName 要下載的文件名 * @param localPath 下載後保存到本地的路徑 * @return */ public boolean downloadFile(String remotePath,String fileName, String localPath) { boolean result = false; try { ftpClient.changeWorkingDirectory(remotePath);// 轉移到FTP服務器目錄 FTPFile[] files = ftpClient.listFiles(); for (FTPFile ff : files) { if (ff.getName().equals(fileName)) { File localFile = new File(localPath + "/" + ff.getName()); OutputStream is = new FileOutputStream(localFile); ftpClient.retrieveFile(ff.getName(), is); is.close(); } } ftpClient.logout(); result = true; } catch (IOException e) { e.printStackTrace(); } finally { closeConnection(); } return result; } public static void main(String[] args) throws FileNotFoundException { FtpUtils f = new 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"); } }
常規存儲,通常狀況是存在tomcat某個文件夾下,或者是將文件以流的形式寫入數據庫對應的表中(一般不建議這麼作,極大的損耗數據庫的I/O流和存儲容量)。
下面連接你們能夠作個參考:
Java上傳文件到tomcat:https://blog.csdn.net/qq_41463655/article/details/84145602
Java常見三種上傳文件方式(其中有包括流的方式):https://blog.csdn.net/weixin_39640122/article/details/80244527服務器