FTP+Nginx搭建图片服务器实践(windows Server2012 R2环境下)

需求描述:前后端分离,后端采用springboot+mybaits+maven,发布的时候打包成jar包,那么这种情况下上传的图片如何存储呢?当然可以选择七牛云存储,或把图片存到数据库。选择七牛云存储是最省事的,但那需要提供一个已备案的域名与之绑定,并且超出免费的流量后需要收费,所以最开始我也选了这种方式,图片存到数据库压根就没考虑。但没有以备案的域名使用七牛云越来越不方便,所以干脆自己搭建一个文件服务器算了。
总体概述
搭建FTP服务器,实现图片的上传下载等操作,把FTP图片存储路径使用Nginx映射成浏览器可以访问的url。
安装Nginx
nginx下载地址 http://nginx.org/en/download.html
FTP+Nginx搭建图片服务器实践(windows Server2012 R2环境下)
下载完后,解压—》修改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),显示如下:
FTP+Nginx搭建图片服务器实践(windows Server2012 R2环境下)
在浏览器中输入上述url(http://localhost:9090)+FTP图片存储路径下存的图片全称,即http://localhost:9090/zhu5.jpg,如下图所示。
FTP+Nginx搭建图片服务器实践(windows Server2012 R2环境下)
到此为止,nginx设置完了!
搭建FTP服务器
首先搭建一个内网可以访问的FTP服务器。具体操作如下:
**第一安装IIS8.0,**如下网址所述
https://www.jianshu.com/p/d1ca9b7ab9a0
(注意:步骤8时一定要选FTP服务器及下面所以选项)
FTP+Nginx搭建图片服务器实践(windows Server2012 R2环境下)
第二为FTP服务器新建用户或用户组(只有这些特定的用户才可以对FTP服务器操作)
如网址中的第7步与第8步,这里还是把这两部复制过来了(https://blog.csdn.net/w1014074794/article/details/52075285)
【我的电脑或计算机】右键→【管理】出现计算机管理界面:
FTP+Nginx搭建图片服务器实践(windows Server2012 R2环境下)
点击【用户】右键,创建新用户:
FTP+Nginx搭建图片服务器实践(windows Server2012 R2环境下)
 按照上面界面输入信息,点击【创建】按钮,即可以创建了新用户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站点
打击开始,选择服务器管理器
FTP+Nginx搭建图片服务器实践(windows Server2012 R2环境下)
选择IIS–>服务器实例–》Internet Information Services
FTP+Nginx搭建图片服务器实践(windows Server2012 R2环境下)
网站–》添加FTP站点
FTP+Nginx搭建图片服务器实践(windows Server2012 R2环境下)
填写站点名与物理路径—》下一步
FTP+Nginx搭建图片服务器实践(windows Server2012 R2环境下)
填写ip地址等信息,如下图–下一步。
FTP+Nginx搭建图片服务器实践(windows Server2012 R2环境下)
选择身份验证方式,授权的用户–》完成
FTP+Nginx搭建图片服务器实践(windows Server2012 R2环境下)
第四FTP站点设置
1:FTP身份验证–》基本身份验证从禁止改为已启用FTP+Nginx搭建图片服务器实践(windows Server2012 R2环境下)
FTP+Nginx搭建图片服务器实践(windows Server2012 R2环境下)
2.FTP防火墙支持–》添加公网ip(不然外网如法访问)
FTP+Nginx搭建图片服务器实践(windows Server2012 R2环境下)
3.控制面板,防火墙–》允许应用或功能通过Windows防火墙–》看需求设置
FTP+Nginx搭建图片服务器实践(windows Server2012 R2环境下)
4.控制面板–》网络和Internet–>Internet选项——》高级–》使用被动FTP…前面的√去掉
FTP+Nginx搭建图片服务器实践(windows Server2012 R2环境下)
5.阿里云控制面板–》添加允许21端口的使用
FTP+Nginx搭建图片服务器实践(windows Server2012 R2环境下)
到此为止FTP服务器算是搭建好了,输入ftp://(外网ip或内网ip):21–>账号,密码,即可以访问资源
FTP+Nginx搭建图片服务器实践(windows Server2012 R2环境下)
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();
        }
    }
}