前言
最近自己在搞一个商城系统,因为以前没接触过,所有东西都是自己一点一点摸索,遇到了很多问题,慢慢慢的也都解决了,这一次遇到问题的是,我需要将商品图片和详情页的图片上传到图片服务器保存,这样的话商城前端做负载均衡的时候就不会无法访问图片了。
我也是在网上找了很久,网上都是复制粘贴,连符号都不改的那种,看着真的很无语,没办法了,只有自己搞吧。
言归正传
我是在linux服务器上基于nginx做的,至于为什么不选择用Tomcat,大家可以去查一下,Tomcat是有访问限制的,所以最好还是用nginx。
准备
1.找一台linux服务器,或者自己安装一台,不会安装的可以借鉴一下我另一篇文章(安装linux教程.)
2.安装nginx;
3.给服务器绑定一个域名
配置nginx
打开nginx配置文件
我这个是linux 软件商店安装的
创建一个新的.conf文件
server {
listen 80;
server_name test.test.com;
charset utf-8;
location /images {
expires 24h;
root /home/;#指定图片存放路径
access_log /home/images/logs/images.log;#图片日志路径
proxy_store on;
proxy_store_access user:rw group:rw all:rw;
proxy_temp_path /home/;#代理临时路径
proxy_redirect off;
proxy_set_header Host 127.0.0.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 1280k;
proxy_connect_timeout 900;
proxy_send_timeout 900;
proxy_read_timeout 900;
proxy_buffer_size 40k;
proxy_buffers 40 320k;
proxy_busy_buffers_size 640k;
proxy_temp_file_write_size 640k;
}
}
上面是我的配置文件
注意:
在保存配置文件之前,需要去指定位置先创建好文件夹以及文件,否则保存配置文件会报错。
在这里要注意一下,我配置的root 目录是/home/,location 是/images;
root 配置的意思是,会在root配置的目录后跟上URL,组成对应的文件路径。
意思就是我们在浏览器输入的这个地址实际访问的是
/home/images/
会把我们的location后面的 /images拼到实际访问的路径之后
所以,不要以为图片可以直接放在home目录下。
当然,如果你认为这样不方便查看或者担心出错,也可以修改一下root,将root改为alias
也就是 alias /home/images/
在浏览器中输入:http://test.test.com/images/1.jpg 就可以访问图片了
总结
root响应的路径:配置的路径(root指向的路径)+完整访问路径(location的路径)+静态文件
alias响应的路径:配置路径+静态文件(去除location中配置的路径)
ftp的安装:
1.安装
因为我用的是宝塔面板,在软件商店里可以找到FTP空间。
安装之后在这里就可以打开了
2.配置账号地址
这里的根目录就填我们上面配置nginx的那个地址:/home/images/
系统对接通过FTP上传到服务器
1.引入jar
<!--FTP包-->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.5</version>
</dependency>
2.创建工具类
因为我是保存商品图片和详情页图片,这些图片都存在修改删除,所以我整理了两个方法,一个是上传,一个是删除
上传:
/**
* Description: 向FTP服务器上传文件
* @param host FTP服务器hostname
* @param port FTP服务器端口
* @param username FTP登录账号
* @param password FTP登录密码
* @param basePath FTP服务器基础目录
* @param filePath FTP服务器文件存放路径。例如分日期存放:/sku/。文件的路径为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 {
ftp.connect(host, port);// 连接FTP服务器
// 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
ftp.login(username, password);// 登录
int reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
System.out.println("FTP服务器连接失败");
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.setFileType(FTP.BINARY_FILE_TYPE);
//上传文件
if (!ftp.storeFile(filename, input)) {
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;
}
删除:
public static boolean deleteFile(String host, int port, String username, String password, String filePath, String filename){
boolean result = false;
FTPClient ftp = new FTPClient();
try {
ftp.connect(host, port);// 连接FTP服务器
// 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
ftp.login(username, password);// 登录
int reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
System.out.println("FTP服务器连接失败");
return result;
}
if (ftp != null) {
ftp.changeWorkingDirectory(filePath);
ftp.dele(filename);
result = true;
}
ftp.logout();
result = true;
} catch (IOException e) {
e.printStackTrace();
System.out.println("---------删除FTP文件错误:"+e.getMessage());
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
System.out.println("------关闭FTP连接错误:"+ioe.getMessage());
}
}
}
return result;
}
上传图片和删除图片的时候,路径都是相对的哦,比如你要删除/home/images/sku/1.jpg;因为我们FTP配置的根目录就是/home/images/,所以,filePath参数就是/sku/,不要搞错了。
3.合成图片地址
就是你保存进数据库的图片地址,任何地方都可以打开的。
这个地址其实是一个合成地址,由图片服务器绑定域名地址(test.test.com/)加上nginx配置的访问地址(images/)再加上图片文件夹以及文件名称(sku/1.jpg),
合在一起就是:http://test.test.com/images/sku/1.jpg