zoukankan      html  css  js  c++  java
  • linux中创建图片服务器减轻传统服务器的压力

    1.1.   传统项目中的图片管理

    传统项目中,可以在web项目中添加一个文件夹,来存放上传的图片。例如在工程的根目录WebRoot下创建一个images文件夹。把图片存放在此文件夹中就可以直接使用在工程中引用。

    优点:引用方便,便于管理

    缺点:

    1、如果是分布式环境图片引用会出现问题。

    2、图片的下载会给服务器增加额外的压力。

    传统图片管理方式在分布式环境中的问题:

    1.2.   分布式环境的图片管理

    分布式环境一般都有一个专门的图片服务器存放图片。

    专门保存图片,不管是哪个服务器接收到图片,都把图片上传到图片服务器。

    图片服务器上需要安装一个http服务器,可以使用tomcat、nginx

    我们使用虚拟机搭建一个专门的服务器来存放图片。在此服务器上安装一个nginx来提供http服务,安装一个ftp服务器来提供图片上传服务。

    1.3.   搭建图片服务器

    第一步:安装vsftpd提供ftp服务(注意跟xftp不同,协议与端口都不同)

    第二步:安装nginx提供http服务

    (这两步请参见这两个文档http://files.cnblogs.com/files/xujingyang/Linux%E4%B8%8Bnginx%E5%92%8Cvsftpd%E5%AE%89%E8%A3%85%E6%89%8B%E5%86%8C.zip)

    1.4.   测试图片服务器

      1.      ftp服务测试。

        a)使用ftp客户端

      

    b)使用java程序

    ftp可以需要依赖commons-net-3.3.jar包。

     1 package cn.xjy.test ;
     2 
     3 import java.io.File ;
     4 import java.io.FileInputStream ;
     5 import org.apache.commons.net.ftp.FTP ;
     6 import org.apache.commons.net.ftp.FTPClient ;
     7 import org.junit.Test ;
     8 
     9 public class TestFTP {
    10     
    11     @Test
    12     public void testFtp() throws Exception {
    13         FTPClient ftpClient = new FTPClient() ;
    14         ftpClient.connect("192.168.48.130") ;
    15         ftpClient.login("ftpuser", "ftpuser");
    16         FileInputStream inputStream=new FileInputStream(new File("src/test/resources/test.txt"));
    17         
    18         ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
    19         ftpClient.storeFile("test.txt", inputStream);
    20         inputStream.close();
    21         ftpClient.logout();
    22     }
    23 }

        

    2.      ftp服务测试

      a)         浏览器测试 (火狐)

    1.5.   SpringMVC中实现图片上传

    上传思路:

    第一步:

    导入common-fileupload的依赖

    1 <!-- 文件上传组件 -->
    2         <dependency>
    3             <groupId>commons-fileupload</groupId>,
    4             <artifactId>commons-fileupload</artifactId>
    5         </dependency>

        

    第二步:

    在SpringMVC配置文件中添加文件上传解析器

    1 <!-- 定义文件上传解析器 -->
    2     <bean id="multipartResolver"
    3         class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    4         <!-- 设定默认编码 -->
    5         <property name="defaultEncoding" value="UTF-8"></property>
    6         <!-- 设定文件上传的最大值5MB,5*1024*1024 -->
    7         <property name="maxUploadSize" value="5242880"></property>
    8     </bean>

    1.6.   Service实现

    1.    获取资源配置文件的内容

    第一步:

    创建资源配置文件

     1 #FTP地址
     2 #FTP端口
     3 FTP_ADDRESS=192.168.31.134
     4 FTP_PORT=21
     5 FTP_USERNAME=ftpuser
     6 FTP_PASSWORD=ftpuser
     7 FTP_BASE_PATH=/home/ftpuser/www
     8 #显示图片使用的url
     9 IMAGE_BASE_URL=http://192.168.31.134
    10 
    11 #rpc协议使用的url
    12 RPC_BASE_URL=http://127.0.0.1:8080/rpc
    13 RPC_CONTENT_SYNC_URL=/cache/sync/content/

    第二步:

    在Spring(applicationContext-dao.xml)容器中加载资源文件

    2.    图片名生成策略

      时间+随机数:

        

     1 package cn.xjy.utils ;
     2 
     3 import java.util.Random ;
     4 
     5 public class NameUtil {
     6     
     7     /**
     8      * 图片名生成
     9      */
    10     public static String genImageName() {
    11         // 取当前时间的长整形值包含毫秒
    12         long millis = System.currentTimeMillis() ;
    13         // long millis = System.nanoTime();
    14         // 加上三位随机数
    15         Random random = new Random() ;
    16         int end3 = random.nextInt(999) ;
    17         // 如果不足三位前面补0
    18         String str = millis + String.format("%03d", end3) ;
    19         
    20         return str ;
    21     }
    22     
    23 }

        或者使用uuid    

    3.    Service实现    

     1 package cn.xjy.service ;
     2 
     3 import java.util.Date ;
     4 import org.springframework.beans.factory.annotation.Value ;
     5 import org.springframework.stereotype.Service ;
     6 import org.springframework.web.multipart.MultipartFile ;
     7 import cn.xjy.bean.PictureResult ;
     8 import cn.xjy.utils.FtpUtil ;
     9 import cn.xjy.utils.NameUtil ;
    10 
    11 @Service
    12 public class PictureServiceImpl implements PictureService {
    13     
    14     @Value("${IMAGE_BASE_URL}")
    15     private String    IMAGE_BASE_URL ;
    16     @Value("${FTP_BASE_PATH}")
    17     private String    FTP_BASE_PATH ;
    18     @Value("${FTP_ADDRESS}")
    19     private String    FTP_ADDRESS ;
    20     @Value("${FTP_PORT}")
    21     private Integer    FTP_PORT ;
    22     @Value("${FTP_USERNAME}")
    23     private String    FTP_USERNAME ;
    24     @Value("${FTP_PASSWORD}")
    25     private String    FTP_PASSWORD ;
    26     
    27     @Override
    28     public PictureResult uploadFile(MultipartFile uploadFile) {
    29         // 上传文件功能实现
    30         String path ;
    31         try {
    32             path = savePicture(uploadFile) ;
    33             // 数据回显
    34             return new PictureResult(0, IMAGE_BASE_URL + path) ;
    35         } catch (Exception e) {
    36             e.printStackTrace() ;
    37         }
    38         return null ;
    39     }
    40     
    41     @Override
    42     public String savePicture(MultipartFile uploadFile) throws Exception {
    43         System.out.println("uploadFile"+uploadFile) ;
    44         // 判断文件是否为空,如果为空则返回
    45         if (uploadFile.isEmpty()) { return null ; }
    46         
    47         // 设置文件上传的目录,以日期为单位,提高访问速度
    48         String filePath = "/" + new Date().getYear() + "/" + new Date().getMonth() + "/"
    49                 + new Date().getDay() ;
    50         System.out.println("filePath"+filePath) ;
    51         // 获取原始文件名
    52         String originalFilename = uploadFile.getOriginalFilename() ;
    53         System.out.println("originalFilename:"+originalFilename) ;
    54         // 生成新文件名
    55         String newFileName = NameUtil.genImageName()
    56                 + originalFilename.substring(originalFilename.lastIndexOf(".")) ;
    57         System.out.println("newFileName"+newFileName) ;
    58         // 上传文件
    59         boolean b = FtpUtil.uploadFile(FTP_ADDRESS, FTP_PORT, FTP_USERNAME, FTP_PASSWORD,
    60                 FTP_BASE_PATH, filePath, newFileName, uploadFile.getInputStream())  ;
    61         System.out.println("上传结果:"+b) ;
    62         
    63         System.out.println("res"+filePath + "/" + newFileName) ;
    64 
    65         return filePath + "/" + newFileName ;
    66         
    67     }
    68 }
    View Code

       

    4.   Controller实现    

     1 package cn.xjy.controller ;
     2 
     3 import org.springframework.beans.factory.annotation.Autowired ;
     4 import org.springframework.stereotype.Controller ;
     5 import org.springframework.web.bind.annotation.RequestMapping ;
     6 import org.springframework.web.bind.annotation.ResponseBody ;
     7 import org.springframework.web.multipart.MultipartFile ;
     8 import cn.xjy.bean.PictureResult ;
     9 import cn.xjy.service.PictureService ;
    10 
    11 @Controller
    12 @RequestMapping("/pic")
    13 public class PictureController {
    14     
    15     @Autowired
    16     PictureService    pictureService ;
    17     
    18     @RequestMapping("/upload")
    19     public @ResponseBody PictureResult upload(MultipartFile uploadFile) {
    20         // 上传图片
    21         PictureResult result = pictureService.uploadFile(uploadFile) ;
    22         return result ;
    23     }
    24 }

     Nginx找不到图片问题:(原因:没有加’user root;’配置,解决:在/usr/local/nginx/conf/nginx.conf 的首行加上 user root;) 步骤如下:   

            

        

    vi /usr/local/nginx/conf/nginx.conf

    修改/usr/local/nginx/conf/nginx.conf 文件配置后,service nginx restart

               

     

     

    注意:nginx.config中要配置root的指向为ftp的家目录

        vim /usr/local/nginx/conf/nginx.conf

                  

  • 相关阅读:
    [Notes] 如何使用abode audition录歌
    [Tips] matlab save load
    [Tips] matlab csv格式文件读写
    [Tips] 随机数 随机序列 随机排列生成
    [Tips] csv 读写
    [record] 初入android
    HTML中表格table边框border(1px还嫌粗)的解决方案:
    CSS颜色代码大全
    ie9下面的console的bug
    js 性能优化 篇一
  • 原文地址:https://www.cnblogs.com/xujingyang/p/7163290.html
Copyright © 2011-2022 走看看