千家信息网

Nginx如何搭建图片服务器

发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,这篇文章给大家分享的是有关Nginx如何搭建图片服务器的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。效果图:需求:实现图片的上传和批量上传技术:Nginx,Vsftpd,S
千家信息网最后更新 2025年02月03日Nginx如何搭建图片服务器

这篇文章给大家分享的是有关Nginx如何搭建图片服务器的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

效果图:

需求:实现图片的上传和批量上传

技术:Nginx,Vsftpd,Spring,SpringMVC,KindEditor,CentOS

说明:本章节内容主要是实现图片的上传功能。使用 KindEditer 是为了更好的演示图片的上传,回显,批量效果。后台代码与KindEditer没有直接关系,放心阅读。另外源码中有Mybatis的jar,不用理会,本章内容用不到,是为后续内容做准备!

源码:见文章底部

场景:用户将图片上传到 tomcat 服务器上,再由 tomcat 服务器通过FTP上传到 Nginx 服务器上。


项目结构:

单元测试

首先要攻破核心技术。通过单元测试实现图片上传的功能。

package com.itdragon.test;import java.io.File;import java.io.FileInputStream;import org.apache.commons.net.ftp.FTP;import org.apache.commons.net.ftp.FTPClient;import org.junit.Test;public class PictureFTPTest {  // 测试 ftp 上传图片功能  @Test  public void testFtpClient() throws Exception {    // 1. 创建一个FtpClient对象    FTPClient ftpClient = new FTPClient();    // 2. 创建 ftp 连接    ftpClient.connect("192.168.0.11", 21);    // 3. 登录 ftp 服务器    ftpClient.login("ftpuser", "root");    // 4. 读取本地文件    FileInputStream inputStream = new FileInputStream(new File("F:\\hello.png"));    // 5. 设置上传的路径    ftpClient.changeWorkingDirectory("/usr/local/nginx/html/images");    // 6. 修改上传文件的格式为二进制    ftpClient.setFileType(FTP.BINARY_FILE_TYPE);    // 7. 服务器存储文件,第一个参数是存储在服务器的文件名,第二个参数是文件流    ftpClient.storeFile("hello.jpg", inputStream);    // 8. 关闭连接    ftpClient.logout();      }  }

说明:这里的ip地址,端口,ftp用户名,密码,本地文件路径,以及Nginx服务器图片路径等,这些字符串参数都要根据自己实际设置的来填写的。如果你的Nginx和Vsftpd安装是按照我提供的链接来做的。那你只需要改ip地址即可。

Maven 的Web 项目

搭建Maven的Web 项目,之前有写过。这里就不过多描述。

项目核心配置文件

首先是 Maven 的核心文件 pom.xml

  4.0.0  com.itdragon.upload  pictrue-service  0.0.1-SNAPSHOT  war        4.12    4.1.3.RELEASE    3.2.8    1.2.2    1.2.15    5.1.6    1.6.4    2.4.2    1.0.9    4.3.5    1.2    2.5    2.0    2.5    3.3.2    1.3.2    3.3    3.4.2    0.9.1    1.3.1    2.7.2    4.10.3                  joda-time      joda-time      ${joda-time.version}                  org.apache.commons      commons-lang3      ${commons-lang3.version}              org.apache.commons      commons-io      ${commons-io.version}              commons-net      commons-net      ${commons-net.version}                  com.fasterxml.jackson.core      jackson-databind      ${jackson.version}                  org.apache.httpcomponents      httpclient      ${httpclient.version}                  junit      junit      ${junit.version}      test                  org.slf4j      slf4j-log4j12      ${slf4j.version}                  org.mybatis      mybatis      ${mybatis.version}              org.mybatis      mybatis-spring      ${mybatis.spring.version}              com.github.miemiedev      mybatis-paginator      ${mybatis.paginator.version}              com.github.pagehelper      pagehelper      ${pagehelper.version}                  mysql      mysql-connector-java      ${mysql.version}                  com.alibaba      druid      ${druid.version}                  org.springframework      spring-context      ${spring.version}              org.springframework      spring-beans      ${spring.version}              org.springframework      spring-webmvc      ${spring.version}              org.springframework      spring-jdbc      ${spring.version}              org.springframework      spring-aspects      ${spring.version}                  jstl      jstl      ${jstl.version}              javax.servlet      servlet-api      ${servlet-api.version}      provided              javax.servlet      jsp-api      ${jsp-api.version}      provided                  commons-fileupload      commons-fileupload      ${commons-fileupload.version}                  redis.clients      jedis      ${jedis.version}                  org.apache.solr      solr-solrj      ${solrj.version}            ${project.artifactId}                        org.apache.maven.plugins        maven-resources-plugin        2.7                  UTF-8                                  org.apache.maven.plugins        maven-compiler-plugin        3.2                  1.7          1.7          UTF-8                                                      org.apache.tomcat.maven          tomcat7-maven-plugin          2.2                    

说明:和文件上传有直接关系的是:

      commons-fileupload      commons-fileupload    

然后是 Web 项目的核心文件 web.xml

  pictrue-service        contextConfigLocation    classpath:spring/applicationContext-*.xml        org.springframework.web.context.ContextLoaderListener          CharacterEncodingFilter    org.springframework.web.filter.CharacterEncodingFilter          encoding      utf-8            CharacterEncodingFilter    /*          pictrue-service    org.springframework.web.servlet.DispatcherServlet          contextConfigLocation      classpath:spring/springmvc.xml        1        pictrue-service    /  

再是 SpringMVC 配置文件 springmvc.xml,需要添加文件上传解析器

                    

最后是 Ftp 配置文件 resource.properties

FTP_ADDRESS=192.168.0.11FTP_PORT=21FTP_USERNAME=ftpuserFTP_PASSWORD=rootFTP_BASE_PATH=/usr/local/nginx/html/imagesIMAGE_BASE_URL=http://192.168.0.11/images

Service 层

上传图片的接口 PictureService.java

package com.itdragon.service;import java.util.Map;import org.springframework.web.multipart.MultipartFile;public interface PictureService {  /**   * 上传,批量上传接口   * @param uploadFile   * @return   */  Map uploadPicture(MultipartFile uploadFile);}

上传图片接口实现类 PictureServiceImpl.java

package com.itdragon.service.impl;import java.io.IOException;import java.io.InputStream;import java.util.HashMap;import java.util.Map;import org.apache.commons.net.ftp.FTP;import org.apache.commons.net.ftp.FTPClient;import org.apache.commons.net.ftp.FTPReply;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Service;import org.springframework.web.multipart.MultipartFile;import com.itdragon.service.PictureService;@Service@SuppressWarnings({"rawtypes", "unchecked"})public class PictureServiceImpl implements PictureService {    // 通过 Spring4 的 Value注解,获取配置文件中的属性值  @Value("${FTP_ADDRESS}")  private String FTP_ADDRESS;   // ftp 服务器ip地址  @Value("${FTP_PORT}")  private Integer FTP_PORT;    // ftp 服务器port,默认是21  @Value("${FTP_USERNAME}")  private String FTP_USERNAME;  // ftp 服务器用户名  @Value("${FTP_PASSWORD}")  private String FTP_PASSWORD;  // ftp 服务器密码  @Value("${FTP_BASE_PATH}")  private String FTP_BASE_PATH;  // ftp 服务器存储图片的绝对路径  @Value("${IMAGE_BASE_URL}")  private String IMAGE_BASE_URL; // ftp 服务器外网访问图片路径  @Override  public Map uploadPicture(MultipartFile uploadFile) {    Map resultMap = new HashMap<>();    try {      // 1. 取原始文件名      String oldName = uploadFile.getOriginalFilename();            // 2. ftp 服务器的文件名      String newName = oldName;      //图片上传      boolean result = uploadFile(FTP_ADDRESS, FTP_PORT, FTP_USERNAME, FTP_PASSWORD,           uploadFile.getInputStream(), FTP_BASE_PATH, newName);      //返回结果      if(!result) {        resultMap.put("error", 1);        resultMap.put("message", "upload Fail");        return resultMap;      }      resultMap.put("error", 0);      resultMap.put("url", IMAGE_BASE_URL + "/" + newName);      return resultMap;          } catch (Exception e) {      e.printStackTrace();      resultMap.put("error", 1);      resultMap.put("message", "upload Fail");      return resultMap;    }  }    /**   * ftp 上传图片方法   * @param ip      ftp 服务器ip地址   * @param port     ftp 服务器port,默认是21   * @param account    ftp 服务器用户名   * @param passwd    ftp 服务器密码   * @param inputStream  文件流   * @param workingDir  ftp 服务器存储图片的绝对路径   * @param fileName   上传到ftp 服务器文件名   * @throws Exception   *    */  public boolean uploadFile(String ip, Integer port, String account, String passwd,      InputStream inputStream, String workingDir, String fileName) throws Exception{    boolean result = false;    // 1. 创建一个FtpClient对象    FTPClient ftpClient = new FTPClient();    try {      // 2. 创建 ftp 连接      ftpClient.connect(ip, port);      // 3. 登录 ftp 服务器      ftpClient.login(account, passwd);      int reply = ftpClient.getReplyCode(); // 获取连接ftp 状态返回值      System.out.println("code : " + reply);      if (!FTPReply.isPositiveCompletion(reply)) {        ftpClient.disconnect(); // 如果返回状态不再 200 ~ 300 则认为连接失败        return result;      }      // 4. 读取本地文件//     FileInputStream inputStream = new FileInputStream(new File("F:\\hello.png"));      // 5. 设置上传的路径      ftpClient.changeWorkingDirectory(workingDir);      // 6. 修改上传文件的格式为二进制      ftpClient.setFileType(FTP.BINARY_FILE_TYPE);      // 7. 服务器存储文件,第一个参数是存储在服务器的文件名,第二个参数是文件流      if (!ftpClient.storeFile(fileName, inputStream)) {        return result;      }      // 8. 关闭连接      inputStream.close();      ftpClient.logout();      result = true;    } catch (Exception e) {      e.printStackTrace();    }finally {      // FIXME 听说,项目里面最好少用try catch 捕获异常,这样会导致Spring的事务回滚出问题???难道之前写的代码都是假代码!!!      if (ftpClient.isConnected()) {        try {          ftpClient.disconnect();        } catch (IOException ioe) {        }      }    }    return result;  }}

说明:

① @Value 注解是Spring4 中提供的,@Value("${XXX}")

② 返回值是一个Map,并且key有error,url,message。这是根据KindEditer的语法要求来的。

Controller 层

负责页面跳转的 PageController.java

package com.itdragon.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;@Controllerpublic class PageController {  /**   * 打开首页   */  @RequestMapping("/")  public String showIndex() {    return "index";  }    @RequestMapping("/{page}")  public String showpage(@PathVariable String page) {    System.out.println("page : " + page);    return page;  }}

负责图片上传的 PictureController.java

package com.itdragon.controller;import java.util.Map;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.multipart.MultipartFile;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.ObjectMapper;import com.itdragon.service.PictureService;@RestControllerpublic class PictureController {  @Autowired  private PictureService pictureService;    @RequestMapping("pic/upload")  public String pictureUpload(@RequestParam(value = "fileUpload") MultipartFile uploadFile) {    String json = "";    try {      Map result = pictureService.uploadPicture(uploadFile);      // 浏览器擅长处理json格式的字符串,为了减少因为浏览器内核不同导致的bug,建议用json      json = new ObjectMapper().writeValueAsString(result);    } catch (JsonProcessingException e) {      e.printStackTrace();    }    return json;  }}

说明:

① @RestController 也是Spring4 提供的,是 @Controller + @ResponseBody 的组合注解。

② Controller层的返回值是一个json格式的字符串。是考虑到浏览器对json解析兼容性比较好。

Views视图层

负责上传图片的jsp页面 pic-upload.jsp

<%@ page language="java" contentType="text/html; UTF-8" pageEncoding="UTF-8"%>ITDragon 图片上传             

测试上传图片功能接口的form表单


借用KindEditor富文本编辑器实现批量上传图片

说明:pic-upload.jsp 分为两个部分,第一个部分是为了测试上传图片功能的form表单。第二个部分是为了更好的体验上传,批量上传,回显功能的KindEditer 富文本编辑器。

感谢各位的阅读!关于"Nginx如何搭建图片服务器"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

服务器 服务 文件 图片 路径 功能 参数 项目 存储 内容 文件名 测试 地址 接口 核心 格式 用户 配置 代码 字符 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 ibm服务器 接口 灵武办公软件开发哪家口碑好 饥荒电脑版联机连接不到服务器 外贸网站服务器在国内 网络安全责任制度有哪些 计算机网络技术能不能报二建 全球最大的通讯服务器 河南普欣网络技术有限公司 江苏特色软件开发标准 心率检测传感器数据库 广州好商汇网络技术有限公司武汉 高德poi数据库 视力不好的人如何做软件开发 服务器上数据库如何执行文件 商丘软件开发税务筹划怎么做 摄像头自己做服务器 东莞市互讯网络技术有限 珠海软件开发公司排行榜 崇明区推广软件开发供应商有哪些 奉贤区节能软件开发服务零售价格 哈工大网络技术 天堂W排队自动切服务器 计算机网络技术三级难不难 正东网络技术开发 加强文献数据库建设 六点网络安全绘画 戴尔r730服务器的液晶屏橙色 游戏赌场软件开发 万方数据库检索的特点 电子科技互联网金融
0