SpringBoot+Ftp+Nginx搭建靜態資源服務器實現靜態資源服務的上傳


SpringBoot+Ftp+Nginx搭建靜態資源服務器實現靜態資源服務的上傳(Windows端)

1.需要的資源

ftp服務器:FileZilla_Server 

下載鏈接:https://www.filezilla.cn/download/server 

nginx服務器:

下載地址:http://nginx.org/en/download.html

2.服務的安裝

第一步安裝Ftp服務器

安裝FileZilla_Server 

 

 配置用戶和目錄

添加一個用戶,配置密碼

找到編輯選擇用戶

 

 添加用戶

 

 

 配置密碼

 

 配置資源路徑

 

 

 

 給給文件目錄權限

 

 最后確認就完成了

第二步配置和啟動Nginx服務器

windows下的nginx配配置和啟動相對簡單可以直接拷貝我的然后修改訪問文件根目錄

 

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    autoindex on;# 顯示目錄
    autoindex_exact_size on;# 顯示文件大小
    autoindex_localtime on;# 顯示文件時間
    
    server {  #這里是我自己配置服務端口
        listen       8081;
        server_name resouce;
        root  C:/Users/Administrator/Desktop/shior1.2.3;  #訪問文件根目錄
        autoindex on;  #是否瀏覽文件下的列表
        location / {  #是否允許跨域
            add_header Access-Control-Allow-Origin *;
        }
        add_header Cache-Control "no-cache,must-revalidate";# 是否緩存
    }

}

 

 

 然后啟動訪問也面http://127.0.0.1:8081/

 

 

 

3.SpringBoot中ftp圖片上傳以及配置

3.1 所需依賴

        <!-- 文件上傳的類 -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.2.2</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-ftp</artifactId>
            <version>2.13.2</version>
        </dependency>  

 

3.2ftp文件上傳工具類 FtpUtil

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * 作者:yangmian
 * 包名:com.haiwei.parkweb.utils
 * 類名:FtpUtil
 * 創建時間:2019/5/13
 * 描述信息:
 */
public class FtpUtil {    /**
 * Description: 向FTP服務器上傳文件
 * @param host FTP服務器ip
 * @param port FTP服務器端口
 * @param username FTP登錄賬號
 * @param password FTP登錄密碼
 * @param basePath FTP服務器基礎目錄,/home/ftpuser/images
 * @param filePath FTP服務器文件存放路徑。例如分日期存放:/2018/05/28。文件的路徑為basePath+filePath
 * @param filename 上傳到FTP服務器上的文件名
 * @param input 輸入流
 * @return 成功返回true,否則返回false
 */
public static boolean uploadFile(String host, int port, String username, String password, String basePath,
                                 String filePath, String filename, InputStream input) {
    boolean result = false;
    FTPClient ftp = new FTPClient();
    try {
        int reply;
        ftp.connect(host, port);// 連接FTP服務器
        // 如果采用默認端口,可以使用ftp.connect(host)的方式直接連接FTP服務器
        ftp.login(username, password);// 登錄
        reply = ftp.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
            ftp.disconnect();
            return result;
        }
        //切換到上傳目錄
        if (!ftp.changeWorkingDirectory(basePath+filePath)) {                //如果目錄不存在創建目錄
            String[] dirs = filePath.split("/");
            String tempPath = basePath;
            for (String dir : dirs) {
                if (null == dir || "".equals(dir)) continue;
                tempPath += "/" + dir;
                if (!ftp.changeWorkingDirectory(tempPath)) {
                    if (!ftp.makeDirectory(tempPath)) {                            return result;
                    } else {
                        ftp.changeWorkingDirectory(tempPath);
                    }
                }
            }
        }            //設置為被動模式
        ftp.setBufferSize(1024*1024*2);
        BufferedInputStream bufferedInputStream = new BufferedInputStream(input);
        ftp.enterLocalPassiveMode();            //設置上傳文件的類型為二進制類型
        ftp.setFileType(FTP.BINARY_FILE_TYPE);            //上傳文件
        if (!ftp.storeFile(filename, bufferedInputStream)) {                return result;
        }
        input.close();
        ftp.logout();
        result = true;
    } catch (IOException e) {
        e.printStackTrace();
    } finally {            if (ftp.isConnected()) {                try {
        ftp.disconnect();
    } catch (IOException ioe) {
    }
    }
    }        return result;
}
}

3.3最后一項就是接口和配置項了

//@RestController
//@CrossOrigin
//@RequestMapping("/FileUpload/*")
//@Api(value = "文件上傳的接口",tags = {"文件上傳的接口"})
public class FileUploadReController {

    @Value("${ftp.ftp-host}")
    private String host;

    @Value("${ftp.ftp-port}")
    private int port;

    @Value("${ftp.ftp-username}")
    private String username;


    @Value("${ftp.ftp-password}")
    private String password;


    @Value("${ftp.ftp-basePath}")
    private String basePath;

    @Value("${nginx.nginx-url}")
    private String nginxUrl;


    public static final String PATH ="/src/main/resources/";

    @PostMapping(value="/fileUpload",headers="content-type=multipart/form-data")
    @ApiOperation(value = "上傳圖片的接口",notes = "上傳圖片的接口",httpMethod = "POST")
    @CrossOrigin
    public String fileUpload( @ApiParam(value="項目的SVG",required=true) MultipartFile file) {
        //獲取文件的老名稱
        String oldFileName = file.getOriginalFilename();

        //獲取文件要保存的路徑
        String url1 = String.valueOf(ClassLoader.getSystemResource(""));
        String url = url1.replace("/target/classes/","");
        String newUrl =url.replace("file:/","").replace("%20"," ");


        String uuid = UUID.randomUUID().toString().replaceAll("-","");
        String newFileName = uuid+oldFileName.substring(oldFileName.lastIndexOf("."));

        //設置文件存放的位置
        String strNow = new SimpleDateFormat("yyyyMMdd").format(new Date()).toString();
        String roolPath = newUrl+PATH+"static/systemimg/"+strNow+"/"+newFileName;
        System.out.println(roolPath);
        //
        File files = new File(roolPath);

        if(!files.getParentFile().exists()){
            files.getParentFile().mkdirs();
        }else{
            System.out.println("存在");
        }
        try {
            if(!files.exists()){
                System.out.println("存入文件");
                file.transferTo(files);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return "systemimg/"+strNow+"/"+newFileName;
    }


    @PostMapping(value="/ftpfileUpload",headers="content-type=multipart/form-data")
    @ApiOperation(value = "ftp上傳圖片的接口",notes = "ftp上傳圖片的接口",httpMethod = "POST")
    @CrossOrigin
    public Results<Object> ftpfileUpload(MultipartFile file) throws IOException {

        //C:/Users/Administrator/Desktop/img/image
        //獲取文件的老名稱
        System.out.println("ftp文件上傳");
        String oldFileName = file.getOriginalFilename();
        System.out.println("文件的Md5為:"+FileMd5.calcMD5(file.getInputStream()));
        String uuid = UUID.randomUUID().toString().replaceAll("-","");
        String newFileName = uuid+oldFileName.substring(oldFileName.lastIndexOf("."));

        //設置文件存放的位置
        String strNow = new SimpleDateFormat("yyyyMMdd").format(new Date()).toString();

        String fielPath = strNow+"/"+newFileName;
         String url=nginxUrl+fielPath;
        InputStream iput = null;
        try {
            iput = file.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Boolean flag = FtpUtil.uploadFile(host,port,username,password,basePath,strNow,newFileName,iput);
        if(flag){
            Results<Object> results = new Results<Object>(200,"SUCCESS", url);
            return results;
        }
        String filed = "FtpfileUpload filed";
        Results<Object> results = new Results<Object>(235,"Error", filed);
        return results;
    }

    @PostMapping(value="/getFileMd5")
    @ApiOperation(value = "獲取文件的MD5",notes = "獲取文件的MD5",httpMethod = "POST")
    @CrossOrigin
    public Results<Object> getFileMd5(MultipartFile file) {
        Results<Object> results = null;
        //C:/Users/Administrator/Desktop/img/image
        //獲取文件的老名稱
        try {
            byte [] byteArr=file.getBytes();
            InputStream inputStream = new ByteArrayInputStream(byteArr);
            String fileMd = FileMd5.calcMD5(inputStream);
            results = new Results<Object>(235,"Success!", fileMd);
        }catch (Exception e){
            e.printStackTrace();
            String filed = "FtpfileUpload filed";
            results = new Results<Object>(235,"Error", filed);
        }

        return results;
    }

}

 yml文件中的配置:

#Ftp靜態資源服務器上傳的路徑
ftp:
  ftp-host: 192.168.0.114
  ftp-port: 21
  ftp-username: user
  ftp-password: sda!sdadas
  ftp-basePath: /NginxFile/Img/
#Nginx靜態資源服務器的的配置
nginx:
  nginx-url: http://192.168.0.114:8080/Img/

  最后各位看官們,記得給個贊哦,后續我會把linux上的ftp+nginx部署發出來,需要催更的請評論!

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM