一、前言
分布式集群的項目,正常一般的工程是把圖片放在web項目的自身服務器的工程中,但在集群環境下,會出現找不到圖片的情況。
代碼參考:https://github.com/zyjcxc/taotao.git
比如:

解決辦法:
linux做磁盤的映射,說能解決,但服務器多了也不好弄,所以可以再搭建一個圖片服務器
圖片服務器兩個服務:
http:可以使用nginx做靜態資源服務器。也可以使用apache。推薦使用nginx,效率更高。也可以結合我之前的mongo文件服務器,將文件url存到Mongo中。
ftp服務:使用linux做服務器,在linux中有個ftp組件vsftpd。
二、步驟
1、服務器需求
Linux:CentOS6.4
Nginx:1.8.0
Vsftpd:需要在線安裝。
2、Nginx安裝
參考Nginx安裝指南.
3、Vsftpd安裝
參考Vsftpd安裝指南.
4、圖片服務器的測試
安裝好環境后,可以用ftp客戶端(FileZilla)測試是否能上傳下載文件。
ftp上傳圖片后,用瀏覽器直接訪問圖片路徑,測試是否有圖片顯示。
5、java代碼實現上傳
使用apache的FTPClient工具訪問ftp服務器。需要在pom文件中添加依賴:
publicclassFTPClientTest{
@Test
publicvoidtestFtp()throwsException{
//1、連接ftp服務器
FTPClientftpClient=newFTPClient();
ftpClient.connect("192.168.1.133",21);
//2、登錄ftp服務器
ftpClient.login("ftpuser","ftpuser");
//3、讀取本地文件
FileInputStreaminputStream=newFileInputStream(newFile("D://Documents//Pictures//images//2010062119283578.jpg"));
//4、上傳文件
//1)指定上傳目錄
ftpClient.changeWorkingDirectory("/home/ftpuser/www/images");
//2)指定文件類型
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
//第一個參數:文件在遠程服務器的名稱
//第二個參數:文件流
ftpClient.storeFile("hello.jpg",inputStream);
//5、退出登錄
ftpClient.logout();
}
}
后續可以根據需求,將其封裝工具類,寫service,contorller即可,截取部分代碼
publicMapuploadPicture(MultipartFileuploadFile){
Map<String,Object>map=newHashMap<>(2);
try{
StringoldName=uploadFile.getOriginalFilename();
StringnewName=IDUtils.genImageName();
newName+=oldName.substring(oldName.lastIndexOf("."));
StringimagePath=newDateTime
().toString("yyyy/MM/dd");
booleanresult=FtpUtil.uploadFile(FTP_HOST,FTP_PORT,FTP_USERNAME,FTP_PASSWORD,FTP_BASE_PATH,imagePath,newName,uploadFile.getInputStream());
if(!result){
map.put("error",1);
map.put("message","文件上傳失敗");
returnmap;
}
map.put("error",0);
map.put("url",IMAGE_BASE_URL+"/"+imagePath+"/"+newName);
}catch(IOExceptione){
map.put("error",1);
map.put("message","文件上傳異常");
e.printStackTrace();
returnmap;
}
returnmap;
}
注意:
springmvc框架,在配置文件中要加入文件上傳解析器