前面已经安装了vsftpd服务:Vsftpd的安装和配置。现在再安装一个nginx服务器,配合起来就能够完成一个简易的图片服务器。nginx服务器之前也研究过,但是没有做什么笔记也都全忘了,事实证明不能太相信自己的记忆,好记性不如烂笔头。
nginx的安装。
本人使用的ubuntu系统,安装nginx比较简单,但是nginx需要依赖几个额外的库,首先因为nginx编译2环境需要依赖gcc环境,所以需要首先安装gcc。
安装gcc:
sudo apt-get build-dep gcc
PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库,pcre-devel是使用pcre开发的一个二次开发库。nginx也需要此库。
安装pcre:
sudo apt-get install libpcre3 libpcre3-dev
zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库。
安装zlib:
sudo apt-get install zlib1g-dev
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库。
安装openssl:
sudo apt-get install openssl libssl-dev
同时这几个库都可以将其下载下来,然后手动编译安装,除了gcc之外的库下载地址如下:
下载prce:https://ftp.pcre.org/pub/pcre/
prce:https://ftp.pcre.org/pub/pcre/pcre2-10.30.tar.gz
zlib:http://www.zlib.net/zlib-1.2.11.tar.gz
openssl:https://www.openssl.org/source/openssl-1.1.1-pre1.tar.gz
安装完上面的几个库之后就可以安装nginx了,首先需要将nginx的源码包下载下来,下载地址为:
下载完成之后将其解压,解压完成进入目录,可以直接执行./configure进行编译,也可以在编译的时候指定一些参数,其他的参数可以参考:linux ./configure 的参数详解。默认的安装目录为/usr/local/nginx。
如果上述的几个库没有安装好的话,在编译的过程中可能会提示没有找到这个依赖库。
编译完成之后就可以使用make&make install进行安装。
然后进入nginx下的sbin目录,执行./nginx即可启动,默认使用80端口,在浏览器中输入ip地址,当出现如下界面,说明安装成功。
修改nginx配置。
当成功安装nginx之后,所看到的界面时在nginx目录下的html中,nginx相关的配置文件在conf下,主要时修改nginx.conf这个文件。
假如想将上传的图片放入/opt/images这个目录下,需要在nginx.conf中在配置一个location:
添加这个配置之后,当有url为/images/的时候就会前去/opt这个目录下查找,这里需要注意的是root对应的目录不要写错了,如果写成/opt/iamges,那么当url为/iamges/时就会查找/opt/iamges/images/这个目录,显然是不正确的;所以正确的就是/opt/,与url中的images组合起来就是/opt/images/,这才是正确的。
上传一张图片到/opt/iamges/目录下,取名为1.jpg。当尝试在访问该图片的时候可能会出现403错误:
这一般就是访问资源的权限问题了,由于本人使用的是root用户,可以在nginx.conf中将第一行的注释去掉,然后修改为如下:
修改完配置之后,重新加载配置文件:
./nginx -s reload
此时再次访问应该就可以了:
通过java代码访问服务器。
如果搭建完了nginx和vsftpd,就可以通过代码来上传和下载图片了。
在apache.commons.net下提供了访问ftp服务器的一些对象,或者在网上有一个封装类FtpUtil,使用这个更为方便。
FtpUtil.java :封装ftp服务进行上传下载。
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服务器基础目录
* @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 下载后保存到本地的路径
* @param localName 本地文件名
* @return
*/
public static boolean downloadFile(String host, int port, String username, String password, String remotePath,
String fileName, String localPath, String localName) {
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)) {
String name = localName.equals("") ? ff.getName() : localName;
File localFile = new File(localPath + "/" + name);
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;
}
}
FTPTest.java 测试ftp服务。
import com.taotao.common.utils.FtpUtil;
import org.apache.commons.net.ftp.FTPClient;
import org.junit.Test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* Ftp服务器测试
* @Author Leafage
* @Date 2018/2/23 22:49
**/
public class FTPTest {
@Test
public void testFtpClient() throws IOException {
// 创建一个FtpClient对象
FTPClient ftpClient = new FTPClient();
// 创建ftp连接
ftpClient.connect("192.168.136.128", 21);
// 登陆ftp服务器,使用用户名和密码
ftpClient.login("root","123456");
// 上传文件
// 读取本地文件
FileInputStream fileInputStream = new FileInputStream("G:\\file\\test_ftpclient.jpg");
// 设置上传路径
ftpClient.changeWorkingDirectory("/opt/images");
// 修改上传文件的格式,将其修改为二进制,默认使用文本格式
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
// 参数:服务端名称和文件流
ftpClient.storeFile("ftpclient.jpg", fileInputStream);
// 关闭连接
ftpClient.logout();
}
@Test
public void testFtpUtils() throws FileNotFoundException {
FileInputStream fileInputStream = new FileInputStream("G:\\file\\test_ftputils.jpg");
FtpUtil.uploadFile("192.168.136.128", 21, "root", "leafage", "/opt/images", "", "testutils.jpg", fileInputStream);
}
@Test
public void testFtpUtilsDowonload() {
FtpUtil.downloadFile("192.168.136.128", 21, "root", "leafage", "/opt/images","1.jpg", "G:\\file\\","dowonload.jpg");
}
}