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部署發出來,需要催更的請評論!
