几种图片服务器的对比
1、直接使用ftp服务器,访问图片路径为 ftp://账户:密码@192.168.0.106/31275-105.jpg
不采用这种方式,不安全容易暴露ftp账户信息
2、直接使用IIS或Tomcat等服务器在项目中访问,图片少的情况可以考虑。商城网站则不行,图片访问处理需搭建图片服务器
3、ftp+nginx服务器,ftp负责上传图片,nginx负责图片的访问
一、需要的组件
1、ftp服务器(图片上传,本文选用IIS为容器)
ps Linux操作系统 可安装
vsftpd作为服务器
2、nginx服务器
a、http服务:可以使用nginx做静态资源服务器。也可以使用apache。推荐使用nginx,效率更高。
b
、反向代理 实现 负载均衡
二、nginx服务器的部署
nginx下载地址
http://nginx.org/en/download.html
解压安装包,免安装运行
nginx cmd命令
start nginx //启动nginxnginx -s stop // 停止nginxnginx -s reload // 重新加载配置文件nginx -s quit // 退出nginxnginx -t //检查配置文件是否正确
nginx -v //查看nginx版本号
1、配置端口号和访问路径
conf目录下的
nginx.conf 配置文件
修改端口号 为9090
启动nginx 回到nginx文件夹根目录,按住shift键点击鼠标右键,选择右键菜单中的在此处打开命令窗口,输入start nginx 命令
成功访问
2、添加图片服务访问配置
1
2
3
4
|
location ~ \.(gif|jpg|jpeg|png|bmp|swf)$ {
#默认的图片路径,也是ftp上传文件存放的路径,只要后缀是以上的都会到这个路径下搜索
root C:/imgextra;
}
|
添加完成以后在cmd中执行 nginx -s reload 重新加载配置使其生效
图片文件所在路径
访问成功
3、图片存放路径分析
先来看看大型商城的图片路径
天猫图片存储
https://gdp.alicdn.com/imgextra/i2/1856815898/TB2QxuMuHBnpuFjSZFGXXX51pXa_!!1856815898.jpg
京东图片存储
https://img30.360buyimg.com/sku/jfs/t4816/236/2599170601/86961/b24bbc4/5902ff58Nc4ceea7c.jpg
当当图片存储
http://img3x5.ddimg.cn/19/20/1206933175-1_x_6.jpg
分析发现几乎都采用CDN和单独的域名来作为独立的图片服务器,目的是为了减少业务服务器的并发访问量。
关于图片服务器架构介绍戳这里
http://blog.csdn.net/dinglang_2009/article/details/31450731
三、FTP服务的安装与使用介绍
1、windows中安装使用FTP服务器请参考
http://blog.csdn.net/w1014074794/article/details/52075285
2、java上传文件到FTP服务器工具类
所需jar包
commons-net-1.4.1.jar
http://files.cnblogs.com/files/cczheng-666/commons-net-1.4.1.zip
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
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
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;
public
class
FtpUtil {
/**
* Description: 向FTP服务器上传文件
* @param host FTP服务器hostname
* @param port FTP服务器端口
* @param username FTP登录账号
* @param password FTP登录密码
* @param basePath FTP服务器基础目录,需要绝对路径 比如:/home/ftpuser/www/images
* @param filePath FTP服务器文件存放路径。例如分日期存放:/2015/01/01。文件的路径为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.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;
}
/**
* Description: 从FTP服务器下载文件
* @param host FTP服务器hostname
* @param port FTP服务器端口
* @param username FTP登录账号
* @param password FTP登录密码
* @param remotePath FTP服务器上的相对路径
* @param fileName 要下载的文件名
* @param localPath 下载后保存到本地的路径
* @return
*/
public
static
boolean
downloadFile(String host,
int
port, String username, String password, String remotePath,
String fileName, String localPath) {
boolean
result =
false
;
FTPClient ftp =
new
FTPClient();
try
{
int
reply;
ftp.connect(host, port);
// 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
ftp.login(username, password);
// 登录
reply = ftp.getReplyCode();
if
(!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return
result;
}
ftp.changeWorkingDirectory(remotePath);
// 转移到FTP服务器目录
FTPFile[] fs = ftp.listFiles();
for
(FTPFile ff : fs) {
if
(ff.getName().equals(fileName)) {
File localFile =
new
File(localPath +
"/"
+ ff.getName());
OutputStream is =
new
FileOutputStream(localFile);
ftp.retrieveFile(ff.getName(), is);
is.close();
}
}
ftp.logout();
result =
true
;
}
catch
(IOException e) {
e.printStackTrace();
}
finally
{
if
(ftp.isConnected()) {
try
{
ftp.disconnect();
}
catch
(IOException ioe) {
}
}
}
return
result;
}
}
|