FTP+Nginx搭建图片服务器实践(windows Server2012 R2环境下)
需求描述:前后端分离,后端采用springboot+mybaits+maven,发布的时候打包成jar包,那么这种情况下上传的图片如何存储呢?当然可以选择七牛云存储,或把图片存到数据库。选择七牛云存储是最省事的,但那需要提供一个已备案的域名与之绑定,并且超出免费的流量后需要收费,所以最开始我也选了这种方式,图片存到数据库压根就没考虑。但没有以备案的域名使用七牛云越来越不方便,所以干脆自己搭建一个文件服务器算了。
总体概述:
搭建FTP服务器,实现图片的上传下载等操作,把FTP图片存储路径使用Nginx映射成浏览器可以访问的url。
安装Nginx
nginx下载地址 http://nginx.org/en/download.html
下载完后,解压—》修改conf目录下的 nginx.conf 配置文件
server {
listen 9090;//修改
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
location ~ .*\.(gif|jpg|jpeg|png)$ { //新增
expires 24h;
root C:/images/;//FTP图片存储路径
access_log C:/images/log;
proxy_store on;
proxy_store_access user:rw group:rw all:rw;
proxy_temp_path C:/images/;
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 9000;
proxy_send_timeout 9000;
proxy_read_timeout 9000;
proxy_buffer_size 400k;
proxy_buffers 400 3200k;
proxy_busy_buffers_size 6400k;
proxy_temp_file_write_size 6400k;
if ( !-e $request_filename)
{
proxy_pass http://127.0.0.1:9090;
}
}
启动nginx:在nginx解压的根目录下,按住shift+单机右键–》点击在此处打开命令窗口(w)–>输入start nginx 命令(若修改了配置文件,需再输入nginx -s reload // 重新加载配置文件)
在浏览器中输入http://localhost:9090 (http://公网ip或局域网ip:9090),显示如下:
在浏览器中输入上述url(http://localhost:9090)+FTP图片存储路径下存的图片全称,即http://localhost:9090/zhu5.jpg,如下图所示。
到此为止,nginx设置完了!
搭建FTP服务器
首先搭建一个内网可以访问的FTP服务器。具体操作如下:
**第一安装IIS8.0,**如下网址所述
https://www.jianshu.com/p/d1ca9b7ab9a0
(注意:步骤8时一定要选FTP服务器及下面所以选项)
第二为FTP服务器新建用户或用户组(只有这些特定的用户才可以对FTP服务器操作)
如网址中的第7步与第8步,这里还是把这两部复制过来了(https://blog.****.net/w1014074794/article/details/52075285)
【我的电脑或计算机】右键→【管理】出现计算机管理界面:
点击【用户】右键,创建新用户:
按照上面界面输入信息,点击【创建】按钮,即可以创建了新用户ftptest。
注意:由于新创建的用户,它的默认分组是在【Users】里,有任何权限,为了安全起见,打开组Users将新建的该用户删除。
为方便对这些用户的管理,最好将他们放入一个专门的组中。例如我们可以创建一个“FTPUsers”组:在“计算机管理”窗口的目录树中单击选中“组”选项,然后在右侧窗格中单击右键,执行“新建组”命令,并将该组命名为“FTPUsers”。接着依次单击“添加”→“高级”→“立即查找”按钮,将刚才创建的用户全部添加进来,最后依次单击“创建”→“结束”按钮。
然而事情并没有完,因为上述创建的用户默认隶属于“Users”组,也就是说他们拥有对大部分资源的浏览权限。为了实现对特定资源的有效管理,需要将这些用户从“Users”组中删除。在“计算机管理”窗口的右侧窗格中双击“Users”选项,用鼠标拖选所有刚添加的用户并单击“删除”按钮即可。
设置独立权限
这里的权限设置需要分两部分来进行,即对FTP服务器主目录的权限设置和对各个用户文件夹的权限设置。假设FTP服务器的主目录路径为“G:/FTPServer”,我们先来取消“FTPUsers”组的用户对“FTPServer”文件夹的“写入 ”权限。右击“FTPServer”文件夹,执行“属性”命令。在打开的“FTPServer 属性”对话框中切换至“安全”选项卡下,然后依次单击“添加”→“高级”→“立即查找”按钮,单击选中“FTPUsers”组并依次单击“确定”按钮回到“FTPServer 属性”对话框。接着在“FTPUsers的权限”列表框中勾选“拒绝写入”复选框。为了使“拒绝写入”权限仅对“FTPServer”文件夹有效,还需要单击“高级”按钮,在“FTPServer的高级安全设置”对话框中双击“权限列表”中的“拒绝FTPUsers写入”选项,打开“FTPServer的权限设置”对话框。在“应用到”下拉列表中选中“只有该文件夹”选项,连续单击“确定”按钮完成设置(如图1)。
接着我们为每个用户创建独立的文件夹(以用户名命名),并针对每个文件夹赋予相应用户适当的权限。以文件夹“hanjiang”为例,在“hanjiang 属性”对话框的“安全”选项卡下将用户“hanjiang”添加进来,并赋予其读取和写入的权限。同理,对于其他文件夹,也只赋予相应用户读取和写入的权限。
第三:创建FTP站点
打击开始,选择服务器管理器
选择IIS–>服务器实例–》Internet Information Services
网站–》添加FTP站点
填写站点名与物理路径—》下一步
填写ip地址等信息,如下图–下一步。
选择身份验证方式,授权的用户–》完成
第四FTP站点设置
1:FTP身份验证–》基本身份验证从禁止改为已启用
2.FTP防火墙支持–》添加公网ip(不然外网如法访问)
3.控制面板,防火墙–》允许应用或功能通过Windows防火墙–》看需求设置
4.控制面板–》网络和Internet–>Internet选项——》高级–》使用被动FTP…前面的√去掉
5.阿里云控制面板–》添加允许21端口的使用
到此为止FTP服务器算是搭建好了,输入ftp://(外网ip或内网ip):21–>账号,密码,即可以访问资源
java代码图片上传:
API网址
http://people.apache.org/~rwinston/commons-net-2.0/site/apidocs/index.html
!--FTP依赖包-->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>2.2</version>
</dependency>
public class FIPServiceImp implements FTPService{
/**本地字符集编码*/
private static final String LOCAL_CHARSET = "GBK";
/**ftp 服务器字符集编码*/
private static final String SERVER_CHARSET = "ISO-8859-1";
@Override
public String upload(FileInputStream fis, String fileName, String foldName) {
FTPClient ftpClient=new FTPClient();
int reply;
String charset = LOCAL_CHARSET;
try {
ftpClient.connect("ip",21);
ftpClient.login("账号","密码");
reply=ftpClient.getReplyCode();
if(!FTPReply.isPositiveCompletion(reply)){
ftpClient.disconnect();
}
// 设置上传目录
ftpClient.changeWorkingDirectory(foldName);
ftpClient.setBufferSize(1024);
ftpClient.enterLocalPassiveMode();
if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {
// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
charset = "UTF-8";
}
ftpClient.setControlEncoding(charset);
fileName = new String(fileName.getBytes(charset),SERVER_CHARSET);
// 设置文件类型(二进制)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.storeFile(fileName, fis);
}catch (Exception e){
e.printStackTrace();
}
return null;
}
@Test
public void testupload(){
FileInputStream fis = null;
try {
fis = new FileInputStream("E://tutest/3.jpg");
String foldName="base";
String fileName="3.jpg";
new FIPServiceImp().upload(fis,fileName,foldName);
}catch (Exception e){
e.printStackTrace();
}
}
}