談談存儲系統

文件存儲是開發中經常用到的。下面我將對以下存儲系統進行說明:html

  • 阿里雲OSS
  • ftp
  • Java常規存儲

1、阿里雲OSS

阿里雲對象存儲服務(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

1.加入Maven依賴

 <dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>2.8.3</version>
</dependency>

2.編寫上傳類

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

2、ftp

因爲我主要參考wordpress,因此關於存儲那塊,我也準備採用ftp的方式。
關於FTP服務搭建能夠參考以下文章:
FTP服務搭建(以CentOS7爲例)
FTP服務搭建(以Ubuntu16.04爲例)安全

關於Java當中如何使用FTP上傳下載文件,你們能夠參考以下步驟:springboot

1.添加maven依賴

<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.3</version>
</dependency>

2.添加配置類(主要是ftp配置相關信息)

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;
    }

}

3.添加工具類並編寫main方法測試

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");
    }
}

3、Java常規存儲

常規存儲,通常狀況是存在tomcat某個文件夾下,或者是將文件以流的形式寫入數據庫對應的表中(一般不建議這麼作,極大的損耗數據庫的I/O流和存儲容量)。
下面連接你們能夠作個參考:
Java上傳文件到tomcat:https://blog.csdn.net/qq_41463655/article/details/84145602
Java常見三種上傳文件方式(其中有包括流的方式):https://blog.csdn.net/weixin_39640122/article/details/80244527服務器

相關文章
相關標籤/搜索