精华内容
下载资源
问答
  • 服务器配置Fastdfs图片存储服务器 一、需要下载以下几个东西。 fastdfs-nginx-module :用于FastDFS整合nginx。用nginx进行代理 二、将这几个压缩文件上传到服务的目录中,本次上传的目录为/opt/. 三、FastDFS–...

    云服务器配置Fastdfs图片存储服务器

    一、需要下载以下几个东西。

    fastdfs-nginx-module :用于FastDFS整合nginx。用nginx进行代理
    在这里插入图片描述

    二、将这几个压缩文件上传到服务的目录中,本次上传的目录为/opt/.

    三、FastDFS–tracker安装

    1、检查FastDFS安装环境

    FastDFS是C语言开发,建议在linux上运行,本教程使用Centos7.0作为安装环境。

    yum install gcc-c++ -y
    # 安装redis的时候,可能需要 yum install gcc-c++ -y automake autoconf 这个两个依赖。
    

    2、安装libevent

     yum -y install libevent
    

    3、安装libfastcommon

    1、将上传的压缩包文件libfastcommonV1.0.7.tar.gz 减压到 /usr/local目录下

    tar -zxvf libfastcommonV1.0.7.tar.gz -C/usr/local/
    

    4、进行libfastcommonV1.0.7目录进行编译

    ./make.sh
    

    5、如果出现编译perl 不识别 运行下面这段命令

    yum -y install zlib zlib-devel pcre pcre-devel gcc gcc-c++ openssl openssl-devel libevent libevent-devel perl unzip net-tools wget
    

    6、编译完成后执行安装

    ./make.sh install
    

    注意:libfastcommon安装好后会自动将库文件拷贝至/usr/lib64下,由于FastDFS程序引用usr/lib目录,所以需要将/usr/lib64下的库文件拷贝至/usr/lib下。

     cp /usr/lib64/libfastcommon.so /usr/lib/
    

    4 、tracker编译安装

    1、将FastDFS_v5.05.tar.gz减压到/usr/local/下

    tar -zxvf FastDFS_v5.05.tar.gz -C/usr/local
    

    2、还是进入FastDFS的根目录只是编制安装

    cd FastDFS
    ./make.sh   
    ./make.sh install
    

    3、安装成功之后,将安装目录下的conf下的文件拷贝到/etc/fdfs/下。

    cd conf
    
    cp  *  /etc/fdfs/
    

    4、修改配置文件

    vim  /etc/fdfs/tracker.conf
    

    在这里插入图片描述

    5、因为没有该目录,所以需要创建该目录。创建fastdfs文件夹

    mkdir  /opt/fastdfs
    

    5 设置启动项

    1、创建启动目录

    mkdir  /usr/local/fdfs  
    

    2、拷贝安装目录/usr/local/FastDFS下stop.sh 和restart.sh 到/usr/local/fdfs/

    cp restart.sh  /usr/local/fdfs/
    cp stop.sh  /usr/local/fdfs/
    

    3、修改启动脚本

    vim /etc/init.d/fdfs_trackerd
    

    将bin换成fdfs ,4处
    在这里插入图片描述
    在这里插入图片描述
    把启动脚本中的路径按照上图修改
    修改完毕后
    注册服务

    cd /etc/init.d/
    chkconfig --add fdfs_trackerd
    

    可以使用 chkconfig --list 查看是否已经添加成功!
    然后可以用启动测试

    service fdfs_trackerd start 
    

    显示绿色的Ok或确认提示则安装成功。

    四、astDFS–storage安装

    1、修改配置文件

    vim /etc/fdfs/storage.conf
    

    修改行号:41,109,118
    在这里插入图片描述
    在这里插入图片描述

    巨坑提醒:上面的tracker_server后的ip地址,测试的时候写云服务器本地的地址(以就是私有ip),整合到Java中的时候写公网ip。

    2 创建fdfs_storage文件夹

    mkdir /opt/fastdfs/fdfs_storage
    

    3 设置启动服务

    vim  /etc/init.d/fdfs_storaged
    

    在这里插入图片描述
    在这里插入图片描述
    启动配置

    cd /etc/init.d/
    
    chkconfig  - -add  fdfs_storaged
    
    chkconfig --list
    

    启动服务

    service fdfs_storaged start 
    
    /opt/fastdfs/ 数据文件及日志
    /usr/bin/fdfs_trackerd 、 fdfs_storaged 启动执行程序
    /usr/local/fdfs/stop.sh 、 restart.sh 关闭、重启脚本
    /usr/bin/fdfs_trackerd 、 fdfs_storaged 启动执行程序
    /etc/init.d/fdfs_tracked 、fdfs_storaged 服务启动脚本
    /etc/fdfs/ 配置文件

    上传图片测试
    astDFS安装成功可通过/usr/bin/fdfs_test测试上传、下载等操作。
    修改/etc/fdfs/client.conf

    vim /etc/fdfs/client.conf
    

    base_path=/opt/fastdfs
    tracker_server=IP:22122
    注意:这是服务器内部测试,需要些私有IP。
    测试代码,a.png是手动上传的图片:

     /usr/bin/fdfs_test /etc/fdfs/client.conf upload /home/a.png
    
    [root@iZ9dl1lxaqlso5Z /]# /usr/bin/fdfs_test /etc/fdfs/client.conf upload /home/a.png
    This is FastDFS client test program v5.05
    
    Copyright (C) 2008, Happy Fish / YuQing
    
    FastDFS may be copied only under the terms of the GNU General
    Public License V3, which may be found in the FastDFS source kit.
    Please visit the FastDFS Home Page http://www.csource.org/ 
    for more detail.
    
    [2019-11-02 16:49:55] DEBUG - base_path=/opt/fastdfs, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0
    
    tracker_query_storage_store_list_without_group: 
            server 1. group_name=, ip_addr=xxx.xx.xxx.xx, port=23000
    
    group_name=group1, ip_addr=xxx.xx.xxx.xx, port=23000
    storage_upload_by_filename
    group_name=group1, remote_filename=M00/00/00/rBHvE129QzOAeCXAAAGvZQOfHw4183.png
    source ip address: xxx.xx.xx.xx
    file timestamp=2019-11-02 16:49:55
    file size=110437
    file crc32=60759822
    example file url: http://xxx.xx.xxx.xx/group1/M00/00/00/rBHvE129QzOAeCXAAAGvZQOfHw4183.png
    storage_upload_slave_by_filename
    group_name=group1, remote_filename=M00/00/00/rBHvE129QzOAeCXAAAGvZQOfHw4183_big.png
    source ip address: xxx.xx.xxx.xx
    file timestamp=2019-11-02 16:49:55
    file size=110437
    file crc32=60759822
    example file url: http://xxx.xx.xxx.xx/group1/M00/00/00/rBHvE129QzOAeCXAAAGvZQOfHw4183_big.png
    [root@iZ9dl1lxaqlso5Z /]# 
    xxx.xx.xxx.xx:这个ip,我替换掉了
    

    对应的上传路径:
    /opt/fastdfs/fdfs_storage/data
    00/00/rBHvE129QzOAeCXAAAGvZQOfHw4183.png

    五、FastDFS整合nginx

    1 安装前配置fastdfs-nginx-module

    1、减压

    tar -zxvf fastdfs-nginx-module_v1.16.tar.gz -C/usr/local
    

    2、编辑配置文件:修改config文件将/usr/local/路径改为/usr/ 3处

    vim fastdfs-nginx-module/src/config
    

    在这里插入图片描述

    3、将FastDFS-nginx-module/src下的mod_fastdfs.conf拷贝至/etc/fdfs/下

    cp mod_fastdfs.conf /etc/fdfs/
    

    修改mod_fastdfs.conf的内容:

    vim /etc/fdfs/mod_fastdfs.conf
    

    行号 10,40 ,53,62
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    4、将libfdfsclient.so拷贝至/usr/lib下

    cp /usr/lib64/libfdfsclient.so /usr/lib/
    

    六、安装nginx

    1、安装nginx 需要先配置nginx 的运行环境

    第一步:安装C语言编译环境

    gcc:yum -y install gcc-c++

    第二步:安装第三方的开发包。

    PCRE
    PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 Perl 兼容的正则表达式库。Nginx的HTTP模块使用PCRE来解析正则表达式,所以需要在Linux上安装PCRE库。

    yum install -y pcre pcre-devel
    

    注:pcre-devel是使用PCRE开发的一个二次开发库。Nginx也需要这个库。
    zlib
    zlib库提供了很多种压缩和解压缩的方式,Nginx使用zlib对HTTP包的内容进行gzip,所以需要在Linux上安装zlib库。

    yum install -y zlib zlib-devel
    

    OpenSSL
    OpenSSL是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
    nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库。

    yum install -y openssl openssl-devel
    

    2、安装nginx

    1、解压到/usr/local下

    tar -zxvf nginx-1.12.2.tar.gz -C/usr/local
    

    2、创建nginx/client目录

    mkdir -p /var/temp/nginx/client
    

    3、编译安装nginx

    configure: 表示自动配置nginx 的相关目录!

    ./configure \
    --prefix=/usr/local/nginx \
    --pid-path=/var/run/nginx/nginx.pid \
    --lock-path=/var/lock/nginx.lock \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/nginx/access.log \
    --with-http_gzip_static_module \
    --http-client-body-temp-path=/var/temp/nginx/client \
    --http-proxy-temp-path=/var/temp/nginx/proxy \
    --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
    --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
    --http-scgi-temp-path=/var/temp/nginx/scgi \
    --add-module=/usr/local/fastdfs-nginx-module/src
    

    编译,需要进到nginx减压的目录

    make
    

    安装

    make install
    

    四 编辑nginx.conf 代理!

    编辑 nginx 的安装路径的nginx.conf

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

    在这里插入图片描述
    启动nginx

    /usr/local/nginx/sbin/nginx
    

    重启:

    /usr/local/nginx/sbin/nginx -s reload
    

    设置开机启动 – os7:需要独立设置

    vim /etc/rc.d/rc.local
    

    在这里插入代码片

    /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
    /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
    /usr/local/nginx/sbin/nginx
    

    关闭防火墙或者开放端口

    systemctl stop firewalld.service
    

    注:/usr/local/nginx/sbin/nginx 自启动失败!centos7.0 版本会失败!权限会高。
    整合java就OK了。

    注意:切记,开放22122端口,以及23000端口。

    如果不开放23000端口,会报连接超时。
    配置文件:tracker.conf

    tracker_server=xxx.xx.xxx.x:22122
    # 连接超时时间,针对socket套接字函数connect,默认为30秒
    connect_timeout=30000
    # 网络通讯超时时间,默认是60秒
    network_timeout=60000
    

    html代码用的是富文本编辑器:wangEditor,直接下载就好。这个代码是借用了别人,我没有去写。上传时没问题的。

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<div id="div1">
    		<p>欢迎使用 wangEditor 富文本编辑器</p>
    	</div>
    	<script src="${PATH}/static/jquery/jquery-2.1.1.min.js"></script>
    	<script src="${PATH}/static/ztree/wangEditor.min.js"></script>
    	<script type="text/javascript">
    		var E = window.wangEditor
    		var editor = new E('#div1')
    
    		// 配置服务器端地址
    		editor.customConfig.uploadImgServer = '${PATH}/uploadImg'
    		editor.customConfig.uploadFileName = 'myFileName'
    	    editor.customConfig.debug = location.href.indexOf('wangeditor_debug_mode=1') > 0 		
    		
    		// 进行下文提到的其他配置
    		
    		editor.customConfig.uploadImgTimeout = 300000   //默认10秒
    		
    		editor.customConfig.uploadImgHooks = {
    		    before: function (xhr, editor, files) {
    		        // 图片上传之前触发
    		        // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,files 是选择的图片文件
    		        
    		        // 如果返回的结果是 {prevent: true, msg: 'xxxx'} 则表示用户放弃上传
    		        // return {
    		        //     prevent: true,
    		        //     msg: '放弃上传'
    		        // }
    		    },
    		    success: function (xhr, editor, result) {
    		        // 图片上传并返回结果,图片插入成功之后触发
    		        // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,result 是服务器端返回的结果
    		        
    		        /* alert("success:" + result); */
    		       /*  alert(eval('(' + result + ')')); */
    		    },
    		    fail: function (xhr, editor, result) {
    		        // 图片上传并返回结果,但图片插入错误时触发
    		        // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,result 是服务器端返回的结果
    		    	alert("fail:" + result);
    		    },
    		    error: function (xhr, editor) {
    		        // 图片上传出错时触发
    		        // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象
    		    },
    		    timeout: function (xhr, editor) {
    		        // 图片上传超时时触发
    		        // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象
    		    },
    		
    		    // 如果服务器端返回的不是 {errno:0, data: [...]} 这种格式,可使用该配置
    		    // (但是,服务器端返回的必须是一个 JSON 格式字符串!!!否则会报错)
    		    customInsert: function (insertImg, result, editor) {
    		        // 图片上传并返回结果,自定义插入图片的事件(而不是编辑器自动插入图片!!!)
    		        // insertImg 是插入图片的函数,editor 是编辑器对象,result 是服务器端返回的结果
    		
    		        // 举例:假如上传图片成功后,服务器端返回的是 {url:'....'} 这种格式,即可这样插入图片:
    		        var url = result.url
    		        alert("customInsert:" + url)
    		        insertImg(url)
    		
    		        // result 必须是一个 JSON 格式字符串!!!否则报错
    		    
    		    }
    		}
    
    		editor.create()
    	</script>
    </body>
    </html>
    
    

    Java代码:controller层

    package com.pmc.controller;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.UUID;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.multipart.MultipartFile;
    
    import com.pmc.util.UploadUtil;
    
    @Controller
    public class FileUploadController {
    
      	@RequestMapping(value = "uploadImg",method = RequestMethod.POST)
      	public @ResponseBody Object uploadImg(@RequestParam("myFileName")MultipartFile myFileName,HttpSession session,HttpServletRequest request) throws IllegalStateException, IOException{
      		 String imgUrl ="";
      		if (myFileName != null) {
      			imgUrl = UploadUtil.uploadImage(myFileName);
      		}
      		Map<String, Object> resultMap = new HashMap<String, Object>();
      		resultMap.put("url", imgUrl);
      		System.out.println(resultMap);
      		return resultMap;
      	}
    }
    
    

    上传代码:

    package com.pmc.util;
    
    import org.csource.fastdfs.ClientGlobal;
    import org.csource.fastdfs.StorageClient;
    import org.csource.fastdfs.TrackerClient;
    import org.csource.fastdfs.TrackerServer;
    import org.springframework.web.multipart.MultipartFile;
    
    import java.io.IOException;
    
    public class UploadUtil {
    
        public static String uploadImage(MultipartFile multipartFile){
            String imgUrl = "http://xxx.xx.xxx.x";
            //上传文件到服务器,配置fdfs的全局链接地址
            String tracker = UploadUtil.class.getResource("/tracker.conf").getPath();//获取配置文件的路径
            try {
                ClientGlobal.init(tracker);
            } catch (Exception e) {
                e.printStackTrace();
            }
            TrackerClient trackerClient = new TrackerClient();
            //获得一个Trackerservice实例
            TrackerServer trackerServer = null;
            try {
                trackerServer = trackerClient.getConnection();
            } catch (IOException e) {
                e.printStackTrace();
            }
            //通过tracker获得一个Storage链接客户端
            StorageClient storageClient = new StorageClient(trackerServer,null);
            try {
                 byte[] bytes = multipartFile.getBytes();//获得上传的二进制文件
                //获得文件后缀名
                String originalFilename = multipartFile.getOriginalFilename();
                int i = originalFilename.lastIndexOf(".");
                String extName = originalFilename.substring(i+1);
                String[] uploadInfos = storageClient.upload_file(bytes,extName,null);
                for (String uploadInfo:uploadInfos) {
                    imgUrl += "/"+uploadInfo;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return imgUrl;
        }
    }
    
    

    测试上传:
    在这里插入图片描述
    完了。以上代码若有错误,请留言。

    展开全文
  • iOS 图片压缩处理,本地存储

    千次阅读 2016-07-30 18:10:53
    iOS 图片压缩处理,本地存储 图片压缩处理 图片本地存储 图片上传服务器 1.图片压缩处理最近做论坛功能,发帖的时候需要用到从相册中选取图片然后上传,由于每次上传图片的最大数量为9张,所以需要对图片进行压缩。...

    iOS 图片压缩处理,本地存储

    • 图片压缩处理
    • 图片本地存储
    • 图片上传服务器

    1.图片压缩处理

    最近做论坛功能,发帖的时候需要用到从相册中选取图片然后上传,由于每次上传图片的最大数量为9张,所以需要对图片进行压缩。开始时用了以前经常用的压缩的方法:

    //压缩图片质量  
    +(UIImage *)reduceImage:(UIImage *)image percent:(float)percent  
    {  
        NSData *imageData = UIImageJPEGRepresentation(image, percent);  
        UIImage *newImage = [UIImage imageWithData:imageData];  
        return newImage;  
    }  
    //压缩图片尺寸  
    + (UIImage*)imageWithImageSimple:(UIImage*)image scaledToSize:(CGSize)newSize  
    {  
        // Create a graphics image context  
        UIGraphicsBeginImageContext(newSize);  
        // new size  
        [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];  
        // Get the new image from the context  
        UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();  
    
        // End the context  
        UIGraphicsEndImageContext();  
        // Return the new image.  
        return newImage;  
    }  

    上面的方法比较常见,可是需要加载到内存中来处理图片,当图片数量多了的时候就会收到内存警告,程序崩溃。研究半天终于在一篇博客中找到了解决方法:

    static size_t getAssetBytesCallback(voidvoid *info, voidvoid *buffer, off_t position, size_t count) {  
        ALAssetRepresentation *rep = (__bridge id)info;  
    
        NSError *error = nil;  
        size_t countRead = [rep getBytes:(uint8_t *)buffer fromOffset:position length:count error:&error];  
    
        if (countRead == 0 && error) {  
            // We have no way of passing this info back to the caller, so we log it, at least.  
            NDDebug(@"thumbnailForAsset:maxPixelSize: got an error reading an asset: %@", error);  
        }  
    
        return countRead;  
    }  
    
    static void releaseAssetCallback(voidvoid *info) {  
        // The info here is an ALAssetRepresentation which we CFRetain in thumbnailForAsset:maxPixelSize:.  
        // This release balances that retain.  
        CFRelease(info);  
    }  
    
    // Returns a UIImage for the given asset, with size length at most the passed size.  
    // The resulting UIImage will be already rotated to UIImageOrientationUp, so its CGImageRef  
    // can be used directly without additional rotation handling.  
    // This is done synchronously, so you should call this method on a background queue/thread.  
    - (UIImage *)thumbnailForAsset:(ALAsset *)asset maxPixelSize:(NSUInteger)size {  
        NSParameterAssert(asset != nil);  
        NSParameterAssert(size > 0);  
    
        ALAssetRepresentation *rep = [asset defaultRepresentation];  
    
        CGDataProviderDirectCallbacks callbacks = {  
            .version = 0,  
            .getBytePointer = NULL,  
            .releaseBytePointer = NULL,  
            .getBytesAtPosition = getAssetBytesCallback,  
            .releaseInfo = releaseAssetCallback,  
        };  
    
        CGDataProviderRef provider = CGDataProviderCreateDirect((voidvoid *)CFBridgingRetain(rep), [rep size], &callbacks);  
        CGImageSourceRef source = CGImageSourceCreateWithDataProvider(provider, NULL);  
    
        CGImageRef imageRef = CGImageSourceCreateThumbnailAtIndex(source, 0, (__bridge CFDictionaryRef) @{  
                                                                                                          (NSString *)kCGImageSourceCreateThumbnailFromImageAlways : @YES,  
                                                                                                          (NSString *)kCGImageSourceThumbnailMaxPixelSize : [NSNumber numberWithInt:size],  
                                                                                                          (NSString *)kCGImageSourceCreateThumbnailWithTransform : @YES,  
                                                                                                          });  
        CFRelease(source);  
        CFRelease(provider);  
    
        if (!imageRef) {  
            return nil;  
        }  
    
        UIImage *toReturn = [UIImage imageWithCGImage:imageRef];  
    
        CFRelease(imageRef);  
    
        return toReturn;  
    }  
    采用上面的方法之后内存占用率很低!

    2.图片本地存储

    把图片缓存到本地,在很多场景都会用到,如果只是存储文件信息,那建一个plist文件,或者数据库就能很方便的解决问题,但是如果存储图片到沙盒就没那么方便了。这里简单介绍两种保存图片到沙盒的方法。
    (1)把图片转为base64的字符串存到数据库中或者plist文件中,然后用到的时候再取出来

     //获取沙盒路径,  
     NSString *path_sandox = NSHomeDirectory();  
     //创建一个存储plist文件的路径  
     NSString *newPath = [path_sandox stringByAppendingPathComponent:@/Documents/pic.plist];  
     NSMutableArray *arr = [[NSMutableArray alloc] init];  
     UIImage *image = [UIImage imageNamed:@"1.png"];  
    
     /* 
      把图片转换为Base64的字符串   
    
      在iphone上有两种读取图片数据的简单方法: UIImageJPEGRepresentation和UIImagePNGRepresentation.  
    
      UIImageJPEGRepresentation函数需要两个参数:图片的引用和压缩系数.而UIImagePNGRepresentation只需要图片引用作为参数.通过在实际使用过程中, 
      比较发现: UIImagePNGRepresentation(UIImage* image) 要比UIImageJPEGRepresentation(UIImage* image, 1.0) 返回的图片数据量大很多. 
      譬如,同样是读取摄像头拍摄的同样景色的照片, UIImagePNGRepresentation()返回的数据量大小为199K , 
      而 UIImageJPEGRepresentation(UIImage* image, 1.0)返回的数据量大小只为140KB,比前者少了50多KB. 
      如果对图片的清晰度要求不高,还可以通过设置 UIImageJPEGRepresentation函数的第二个参数,大幅度降低图片数据量.譬如,刚才拍摄的图片,  
      通过调用UIImageJPEGRepresentation(UIImage* image, 1.0)读取数据时,返回的数据大小为140KB,但更改压缩系数后, 
      通过调用UIImageJPEGRepresentation(UIImage* image, 0.5)读取数据时,返回的数据大小只有11KB多,大大压缩了图片的数据量 , 
      而且从视角角度看,图片的质量并没有明显的降低.因此,在读取图片数据内容时,建议优先使用UIImageJPEGRepresentation, 
      并可根据自己的实际使用场景,设置压缩系数,进一步降低图片数据量大小. 
      */  
    
     NSData *_data = UIImageJPEGRepresentation(image, 1.0f);  
     //将图片的data转化为字符串  
     NSString *strimage64 = [_data base64EncodedString];  
    
     [arr addObject:image64];      
      //写入plist文件      
     if ([arr writeToFile:newPath atomically:YES]) {         
     NSLog(@"写入成功");      
    };  
     //可以到沙河路径下查看plist文件中的图片数据   
    
     //这样就存起来的,然后用到的时候再利用存储的字符串转化为图片  
    
     //NSData *_decodedImageData = [[NSData alloc] initWithBase64Encoding:image64];  这是iOS7之前的一个方法   
    
     NSData *_decodedImageData = [[NSData alloc]initWithBase64EncodedString:strimage64 options:NSDataBase64DecodingIgnoreUnknownCharacters];  
     UIImage *_decodedImage = [UIImage imageWithData:_decodedImageData];  
    
     //可以打印下图片是否存在  
     NSLog(@"===Decoded image size: %@", NSStringFromCGSize(_decodedImage.size));  
    
    // 查看沙盒路径
     NSLog(@"imgPath = %@", NSHomeDirectory());  

    (2)把图片直接保存到沙盒中,然后再把路径存储起来,等到用图片的时候先获取图片的路径,再通过路径拿到图片

    //拿到图片  
    UIImage *image2 = [UIImage imageNamed:@"1.png"];   
    NSString *path_document = NSHomeDirectory();  
    //设置一个图片的存储路径  
    NSString *imagePath = [path_document stringByAppendingString:@"/Documents/pic.png"];  
    //把图片直接保存到指定的路径(同时应该把图片的路径imagePath存起来,下次就可以直接用来取)  
    [UIImagePNGRepresentation(image2) writeToFile:imagePath atomically:YES]; 
    
    // 下次利用图片的地址直接来拿图片。
    UIImage *getimage2 = [UIImage imageWithContentsOfFile:imagePath];  
    NSLog(@"image2 is size %@",NSStringFromCGSize(getimage2.size));  

    常用沙盒路径

    //Home目录
    NSString *homeDirectory = NSHomeDirectory();  
    
    //Document目录
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);    
    NSString *path = [paths objectAtIndex:0];  
    
    //Cache目录
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);    
    NSString *path = [paths objectAtIndex:0];  
    
    //Libaray目录
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);   
    NSString *path = [paths objectAtIndex:0];  
    
    // NSUserDefaults 路径在 Library->preference
    NSUserDefaults *users = [NSUserDefaults standardUserDefaults];
                [users setBool:YES forKey:@"login"];
                [users setValue:value forKey:@"userID"];
                NSLog(@"%@",NSHomeDirectory());
                [users synchronize];

    参考博客:
    1.http://blog.csdn.net/u012716788/article/details/49564027
    2.http://blog.csdn.net/apple_app/article/details/38847357

    展开全文
  • FastDFS合并存储以及图片压缩配置

    千次阅读 2019-07-21 02:05:55
    一、合并存储配置 FastDFS提供了合并存储功能的实现,所有的配置都在tracker...storage服务器磁盘上存储的合并后的实际文件,默认大小为64MB。Trunk文件文件名格式:fdfs_storage1/data/00/00/000001 文件名从1开始...

    一、合并存储配置

    FastDFS提供了合并存储功能的实现,所有的配置都在tracker.conf文件之中

    开启合并存储只需要设置use_trunk_file = truestore_server=1

    trunk文件

    storage服务器磁盘上存储的合并后的实际文件,默认大小为64MB
    Trunk文件文件名格式:fdfs_storage1/data/00/00/000001 文件名从1开始递增,类型为int

    合并存储文件的fileid

    表示服务器启用合并存储后,每次上传返回给客户端的fileid,注意此时该fileid与磁盘上的文件没有一一对应关系

    没有合并存储的fileid

    表示服务器未启用合并存储时,Upload返回的fileid

    配置如下

    二、测试

    测试上传,有个000001目录

    /usr/bin/fdfs_test  /etc/fdfs/client.conf  upload  /etc/fdfs/anti-steal.jpg

    二、图片压缩

    image_filter模块

    nginx_http_image_filter_module在nginx 0.7.54以后才出现的,用于对JPEG, GIF和PNG图片进行转换处理(压缩图片、裁剪图片、旋转图片)。这个模块默认不被编译,所以要在编译nginx源码的时候,加入相关配置信息

    检测nginx模块安装情况

    /zhuzq/servier/nginx/sbin/nginx -V

    (1)安装gdHttpImageFilterModule模块需要依赖gd-devel的支持

    yum -y install gd-devel

    (2)将http_image_filter_module包含进来

    cd nginx-1.15.6

     ./configure \
     --prefix=/zhuzq/servier/nginx \
     --pid-path=/var/run/nginx/nginx.pid \
     --lock-path=/var/lock/nginx.lock \
     --error-log-path=/var/log/nginx/error.log \
     --http-log-path=/var/log/nginx/access.log \
     --http-client-body-temp-path=/var/temp/nginx/client \
     --http-proxy-temp-path=/var/temp/nginx/proxy \
     --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
     --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
     --http-scgi-temp-path=/var/temp/nginx/scgi \
     --with-http_gzip_static_module \
     --add-module=/opt/fastdfs-nginx-module-1.20/src \
     --with-http_stub_status_module \
     --with-http_ssl_module \
     --with-http_realip_module \
     --with-http_image_filter_module

    说明:

    nginx安装路径  /zhuzq/servier/nginx

    FastDFS的Nginx模块路径 /opt/fastdfs-nginx-module-1.20/sr 

    编译与安装

    make && make install

    查看是否安装成功

    /zhuzq/servier/nginx/sbin/nginx -V

    配置nginx.conf文件

    vim /zhuzq/servier/nginx/conf/nginx.conf
    location ~group1/M00/(.+)_(\d+)x(\d+)\.(jpg|gif|png){
                alias /zhuzq/server/fastdfs/storage/data/;
                 ngx_fastdfs_module;
                 set $w $2;
                 set $h $3;
                 if ($w != "0") {
                      rewrite group1/M00(.+)_(\d+)x(\d+)\.(jpg|gif|png)$ group1/M00$1.$4 break;
                  }set $h $3;
                 if ($h != "0") {
                      rewrite group1/M00(.+)_(\d+)x(\d+)\.(jpg|gif|png)$ group1/M00$1.$4 break;
                  }
                image_filter resize $w $h;
                image_filter_buffer 2M;
              }

    重启Nginx

    /zhuzq/servier/nginx/sbin/nginx -s stop
    /zhuzq/servier/nginx/sbin/nginx

    http://39.97.176.160:8081/group1/M00/00/00/rBIAA10ljqWAMV-zAABdrSqbHGQ439_400x200.jpg

    http://39.97.176.160:8081/group1/M00/00/00/rBIAA10ljqWAMV-zAABdrSqbHGQ439_600x200.jpg

    http://39.97.176.160:8081/group1/M00/00/00/rBIAA10ljqWAMV-zAABdrSqbHGQ439_800x200.jpg

    说明:

    alias /kkb/server/fastdfs/storage/data/   设置别名(类似于root的用法)
    image_filter resize $w $h;  #根据给定的长宽生成缩略图  
    image_filter_buffer 2M;#原图最大2M,要裁剪的图片超过2M返回415错误,需要调节参数image_filter_buffer  

    其他

    image_filter off;
     #关闭模块
     
     
     image_filter test;
     #确保图片是jpeg gif png否则返415错误
     
     
     image_filter size;
     #输出有关图像的json格式:例如以下显示{ "img" : { "width": 100, "height": 100, "type": "gif" } } 出错显示:{}
     
     
     image_filter rotate 90|180|270;
     #旋转指定度数的图像,參数能够包括变量,单独或一起与resize crop一起使用。
     
     
     image_filter resize width height;
     #按比例降低图像到指定大小,公降低一个能够还有一个用"-"来表示,出错415,參数值可包括变量,能够与rotate一起使用,则两个一起生效。
     
     
     image_filter crop width height;
     #按比例降低图像比較大的側面积和还有一側多余的载翦边缘,其他和rotate一样。没太理解
     
     
     image_filter_buffer 10M;
     #设置读取图像缓冲的最大大小,超过则415错误。
     
     
     image_filter_interlace on;
     #假设启用,终于的图像将被交错。对于JPEG,终于的图像将在“渐进式JPEG”格式。
     
     
     image_filter_jpeg_quality 95;
     #设置变换的JPEG图像的期望质量。可接受的值是从1到100的范围内。较小的值通常意味着既降低图像质量,降低数据传输,推荐的最大值为95。參数值能够包括变量。
     
     
     image_filter_sharpen 100;
     #添加了终于图像的清晰度。锐度百分比能够超过100。零值将禁用锐化。參数值能够包括变量。
     
     
     image_filter_transparency on;
     #定义是否应该透明转换的GIF图像或PNG图像与调色板中指定的颜色时,能够保留。透明度的损失将导致更好的图像质量。在PNG的Alpha通道总是保留透明度。
    

     

    展开全文
  • 需求背景说明 最近后端管理项目中需要...我主要是提供了两种方式进行图片压缩,第一种是使用Java自带的Image绘制图像,输入指定的宽高尺寸,最后在重新绘制新的图片,核心代码也就三四行左右,压缩绘制算法都是JDK底...

    需求背景说明 最近后端管理项目中需要用到用户一些证件图片进行表单文件的上传 如果每个人的证件照片都非常大,对服务器资源将是一种浪费, 因为用户量也不是很大,所以也没对接第三方的OSS或者七牛云存储对象,就写个简单的图像压缩吧,我主要是提供了两种方式进行图片压缩,第一种是使用Java自带的Image绘制图像,输入指定的宽高尺寸,最后在重新绘制新的图片,核心代码也就三四行左右,压缩绘制算法都是JDK底层已经封装完成了,直接调用就行。
    第二种是使用Google的压缩工具类Thumbnails 大名鼎鼎的不一般,只需要一行代码即可,可实现的功能那是相当的丰富,图像指定宽高压缩,原图压缩,添加水印,图像旋转,指定图像压缩质量比例等等。前端调用使用ajax通过表单对象形式获取文件,并设置formData参数传给后端。

    先看一下ajax前端发送请求需要注意的事项,我没有直接使用html表单的形式,设置相应的表单属性来请求action操作,而是new 一个新的表单对象,然后获取标签属性上的元素 来封装成一个完整的对象如下:

    需要注意的是上传文件时候data类型必须是formdata类型,Content-Type类型为: multipart/form-data; boundary=OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp,boundary是请求参数之间的界限标识,服务器会通过他来做参数隔离与获取,这个Content-Type并不是我们自己设置的,而是jQuery默认设置的formdata的Content-Type,如果我们自己设置了Content-Type,jQuery会通过设置的把原来默认的覆盖掉(默认jQuery会把ContentType设置为application/x-www-form-urlencoded),这样服务器在获取传入的参数时候会报错 no multipart boundary was found,当时也是想不明白是咋回事,因为服务器无法获取到boundary就无法区分参数与文件,所以我们的解决办法是把contentType设置为false,并把processData也设置为false,让那个jQuery不去处理formdata,如果不做限制jQuery会把formData转换成String类型,真的是有无穷多的细节在里面。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>图片上传测试</title>
    </head>
    <body>
    <div class="auth_wrapper">
        <div class="picture picture1">
            <span><h1>文件上传测试</h1></span>
            <span></span>
        </div>
        <div class="auth_right">
            <label>
                <input id="file" type="file" name="file" accept="image/png, image/jpeg, image/jpg" style="left: -9999px; position: absolute;">
                <div class="btn btn-default" onclick="change()">点我上传文件!!!</div>
            </label>
            <text class="load_img1_tip hidden"></text>
        </div>
    </div>
    //  此处需要引入相关的jQuery.js文件可自己下载到本地也可CDN网址加载
    <script type="text/javascript" src="../image/common/jquery-1.9.1.min.js"></script>
    <script type="text/javascript" src="../image/common/jquery.actual.min.js"></script>
    <script type="text/javascript" src="../image/common/bootstrap.min.js"></script>
    <script type="text/javascript" src="../image/common/fileinput.min.js"></script>
    <script type="text/javascript" src="../image/common/zh.js"></script>
    <script>
        /**
         * 监听元素变化时候执行该方法 可以看出监听的元素是 <input>标签中的file元素 也可直接不用change方法 调用submit()方法 但是需要注意的是直接点击后调用该方法 当我们选择了
         * 图片后不再再次出发上传图片的接口
         */
        function change () {
            $("#file").change(function () {
                submit()
            });
        }
        //上传图片到服务器 ajax 请求调用图片上传和压缩
        function submit() {
            var formdata = new FormData();
            formdata.append('imageFile', $('#file')[0].files[0]);
            $.ajax({
                async: false,
                type: 'POST',
                url: "http://127.0.0.1:8001/file/upload",
                dataType: 'json',
                data: formdata,
                contentType: false, //ajax上传图片需要添加
                processData: false, //ajax上传图片需要添加
                success: function (data) {
                    alert(data.responseText)
                },
                error: function (data) {
                    alert(data.responseText)
                }
            })
        }
    </script>
    </body>
    </html>

    最终显示效果图:

    原图:4.5M

    压缩后图片:19K

    上传文件效果图和目录结构:

    上传完成:

    服务端代码:

    Controller层代码如下:

    import com.sunlands.feo.common.util.FileCompress;
    import io.swagger.annotations.ApiOperation;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.bind.annotation.PostMapping;
    
    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;
    
    /**
     * @author :冉野
     * @date :Created in 2019-07-11 13:27
     * @description:文件处理Controller
     * @modified By:
     * @version: 1.0.4$
     */
    @Slf4j
    @RestController
    @RequestMapping("/file")
    public class FileProcessController {
    
        @ApiOperation("图片上传")
        @PostMapping(value = "/upload")
        public String upload(@RequestParam(name = "imageFile") MultipartFile imageFile) {
    
            String filePath = FileCompress.thumbnail(imageFile, 0, 0, "");
            log.info("图片存储路径:[{}]",filePath);
            return filePath;
    
        }
    }

    Java原生JDK压缩方式和Google工具类压缩和上传的两种方式:
     

    package com.sunlands.feo.common.util;
    
    import lombok.extern.slf4j.Slf4j;
    import net.coobird.thumbnailator.Thumbnails;
    import org.springframework.web.multipart.MultipartFile;
    
    
    import javax.imageio.ImageIO;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.UUID;
    
    
    /**
     * @author :冉野
     * @date :Created in 2019-07-12 09:29
     * @description:测试图片压缩 测试使用写博客用 需求背景说明 最近后端管理项目中需要用到用户一些证件图片进行表单文件的上传 如果每个人的证件照片都非常大,对服务器资源将是一种浪费,
     * 因为用户量也不是很大,所以也没对接第三方的OSS或者七牛云存储对象,就写个简单的图像压缩吧,我主要是提供了两种方式进行图片压缩,第一种是使用Java自带的Image绘制图像,输入指定的宽高尺寸,最后
     * 在重新绘制新的图片,核心代码也就三四行左右,压缩绘制算法都是JDK底层已经封装完成了。
     * 第二种是使用Google的压缩工具类Thumbnails 大名鼎鼎的不一般,只需要一行代码即可,可实现的功能那是相当的丰富,图像指定宽高压缩,原图压缩,添加水印,图像旋转,指定图像压缩质量比例等等。
     * @modified By:不要重复造轮子 不要重复造轮子 不要重复造轮子
     * @version: 0.0.1$
     */
    @Slf4j
    public class ImageCompress {
    
            // 这链接地址是拼接对应的服务器地址 用于回显给前端该图片地址使用。最后返回的效果是这样的:https://ucr.nb01.xyz/image-ucr/700393939333.png
            // 前端通过该地址可在浏览器直接访问,需要说明一点是 图片上传在了/opt/image目录下,最后通过地址能访问到该图片,需要通过nginx做一层转发,具体那就是运维可以配置一下或者自己NGINX 配置一下。
            private static final String PROD_URL = "";
            private static final String TEST_URL = "https://ucr.nb01.xyz/image-ucr/";
            private static final String LOCAL_URL = "http://127.0.0.1:8802/feo/";
            // 用的MAC系统,所以直接放在了系统的根目录某个文件夹下 如果是Win系统也可指定在某个盘符下存储即可。
            private static final String dirPath = "/opt/image";
            // 方式一压缩
            public static String imageCompress(MultipartFile file, int targetWidth, int targetHeight) {
                long startTime = System.currentTimeMillis();
                //得到上传时的原文件名
                String originalFilename = file.getOriginalFilename();
                //获取文件后缀名
                String suffixName = originalFilename.substring(originalFilename.lastIndexOf("."));
                String imageType = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
                //通过系统时间戳来命名文件:不是非常的规范请勿模仿
                String name = String.valueOf(System.nanoTime());
                String saveName = name.concat(suffixName);
                //存储目录
                String savePath = UploadPathUtils.getPicUploadDir(targetWidth, targetHeight);
                //图片存储全路径
                String outputPath = savePath.concat("/").concat(saveName);
                log.info("图片存储路径:[{}]",outputPath);
                OutputStream fouts = null;
                // 以上都是前期的准备
                try {
                    //读取源图
                    BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
                    // 获取源图宽度
                    double srcWidth = bufferedImage.getWidth();
                    // 获取源图高度
                    double srcHeight = bufferedImage.getHeight();
                    // 判断是否是需要压缩的尺寸比原图小 否则不进行压缩
                    if ((int) srcWidth >= targetWidth && (int) srcHeight >= targetHeight) {
                        // 建立传输通道---文件输出流 最后以流的形式把文件内容传输过去
                        fouts = new FileOutputStream(outputPath);
                        // 绘制新图时,使用Image.SCALE_SMOOTH算法,压缩后的图片质量相对比较光滑,没有明显的锯齿形,又叫做图片压缩光滑算法
                        // 还可选择其他压缩算法 例如:SCALE_FAST 比光滑算法更快速,还有默认算法等可选。
                        Image image = bufferedImage.getScaledInstance(targetWidth, targetHeight, Image.SCALE_SMOOTH);
                        BufferedImage bufferedImage1 = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);
                        Graphics g = bufferedImage1.getGraphics();
                        g.setColor(Color.RED);
                        //绘制处理后的图
                        g.drawImage(image, 0, 0, null);
                        g.dispose();
                        ImageIO.write(bufferedImage1, imageType, fouts);
                        log.info("图片压缩结束");
                    }
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (fouts != null) {
                        try {
                            fouts.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
                if (FileUtil.isLinux()) {
                    outputPath = TEST_URL.concat(saveName);
                }
                return outputPath;
            }
    
        /**
         * 方式二压缩 Google大法 因为Thumbnails.of() 方法是一个重载方法,参数不仅仅局限于是一个文件类型 可以是以流的形式 File形式,ImageBuffer对象,URL路径,String类型指定文件路径
         * 然后可通过链式构造器传入不通参数,压缩比例,指定输出的格式等最终通过toFile("文件存储路径")返回一个已经压缩完成的图片。
         * @param file 待压缩的文件
         * @return 压缩后图片路径 这个可自己指定
         */
        public static String thumbnail(MultipartFile file) {
            //得到上传时的原文件名
            String originalFilename = file.getOriginalFilename();
            //获取文件格式
            String ext = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
            //获取uuid作为文件名
            String name = UUID.randomUUID().toString().replaceAll("-", "");
            try {
                // 先尝试压缩并保存图片
                Thumbnails.of(file.getInputStream()).scale(0.5f)
                        .outputQuality(0.15f)
                        .outputFormat("jpeg")
                        .toFile("/image/" + name);
            } catch (IOException e) {
    
            }
            return TEST_URL.concat(name).concat(".").concat("jpeg");
        }
        }
    
    

     

     

    展开全文
  • 需求: 最近在做项目的时候采用了多模块的方案 ...方案一:自己搭建一个ftp服务器上传图片 然后再搭建一个nginx服务器来访问 方案二:采用七牛云存储平台 这里我采用的是方案二 因为没有体验过七牛 借
  • 本文章介绍了关于ios中摄像头/相册获取图片压缩图片,上传服务器方法总结,有需要了解的同学可以参考一下下。 这几天在搞iphone上面一个应用的开发,里面有需要摄像头/相册编程和图片上传的问题,在这里总结...
  • 在安卓开发中有一个非常常用的功能就是上传图片了,但往往图片较大,而安卓屏幕较小,不需要过高的分辨率,我们需要压缩一下在发送到服务器这样可以减少服务器存储压力和减少网络的使用。 下面是服务端的代码就是...
  • 图片压缩

    2015-06-02 19:26:06
    在项目开发中,很多时候需要按照一定比例进行图片的展示,但是上传的图片层次不齐,并且太多的图片上传后,保存到服务器,会大量的占用服务器存储空间,因此可以考虑先进行压缩图片后才保存。 /** * 改变图片的...
  • 在做网站开发时,我常常会做一些这样的工作:一张大图中包含了许多的小图,而网站中为了使用其中一张小图我不得不把大图切成一张张的小图。虽然这样的工作不多;...所以有了今天的服务器端剪切压缩图片的一章。
  • ios中摄像头/相册获取图片压缩图片,上传服务器方法总结部分知识】 iphone中图像通常存储在4个地方【相册、应用程序包、沙盒、Internet】,通过这4个源,我们就可以存取应用图片。 相册  iphone的相册包含...
  • 二进制字符 能转换为图片 并且把图片存储服务器上吗?   做一个后台程序 客户端上传图片 是二进制字符,,字符3.5m 压缩之后 56kb, 如果用get 方式 1024字节 也就是一个kb,,所以这种方式out掉   说换...
  • 本文章介绍了关于ios中摄像头/相册获取图片压缩图片,上传服务器方法总结,有需要了解的同学可以参考一下下。 【部分知识】这几天在搞iphone上面一个应用的开发,里面有需要摄像头/相册编程和图片上传的问题,...
  • 从入门到精通-分布式文件系统架构-FastDFS,FastDFS-Nginx整合,合并存储存储缩略图,图片压缩,Java客户端一、FastDFS介绍二、流程图FastDFS架构原理分析(重点)架构分析Tracker Server:跟踪服务器Storage Server...
  • iphone中图像通常存储在4个地方【相册、应用程序包、沙盒、Internet】,通过这4个源,我们就可以存取应用图片。 相册   iphone的相册包含摄像头胶卷+用户计算机同步的部分照片。用户可以通过...
  • 但是,注意:相册中的图片机器路径无法直接从应用程序访问,只能通过终端用户去选择和使用相册图片  应用程序包  应用程序包可能会将图像与可执行程序、Info.plist文件和其他资源一同存储。我们可以通过本地文件...
  • iphone中图像通常存储在4个地方【相册、应用程序包、沙盒、Internet】,通过这4个源,我们就可以存取应用图片。  相册  iphone的相册包含摄像头胶卷+用户计算机同步的部分照片。用户可以通过...
  • Nginx - 实现图片压缩

    2020-05-27 01:00:22
    图片压缩的目的2. 图片压缩实现过程2.1 动态模块的编译安装2.2 将动态模块加载到文件中2.3 测试 1. 图片压缩的目的 在企业当中,nginx服务器上的资源要尽可能的占用的空间少一点; 实际上信息量大的网页和高清图片...
  • 支持即时快照存储立即选择,本地相册图片选择,图片个数自定义上限,图片选择记忆选择的图片,十分完美,还支持点击查看放大图片,,获取图片的数据数据时,对原图片进行保真压缩,大小为1M以内,方便大多数项目可以...
  • 图片压缩可以通过前端或者后端都可以实现,这里主要闲扯一下我使用的前端图片压缩:  这里介绍的js压缩图片的主要思想是:首先求出上传的图片大小,然后判断是否大于限制的最大size,若大于,则将图片进行压缩。...
  • 2.实现网页压缩3 实现图片压缩 1 为什么要进行压缩? 在实际的企业当中,nginx服务器上的资源要尽可能的占用的空间少一点 因为信息量大的网页和高清图片占用存储空间非常大,这样不利于服务器性能的优化 因此要在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 402
精华内容 160
关键字:

服务器图片压缩存储