iOS优秀的图片压缩处理方案

背景:

*近遇到一个图片压缩的问题,项目需求压缩图片500k以内上传服务器,还要求图片要清晰一点。事实证明500k的图片肉眼识别已经是很清晰,那就没办法了,硬着头皮上了。下面是我的一些心得体会,以及考虑到的一些方向,拿出来以供大家参考。

 

思路:

本来以为很简单的问题,自己随意写了一个UIImageJPEGRepresentation的方法进行一个循环压缩不就搞定了?后来事实证明这个想法是错的,有太多东西不是你想当然的。

问题:

1.为什么不提UIImagePNGRepresentation(<#UIImage * _Nonnull image#>)?

回复:据说这个读取图片的大小会比较大,因为是png格式,读取的内容会有多图层的的问题导致读取的会显示比较大,而且比较耗时间。网上有人做过测试:同样是读取摄像头拍摄的同样景色的照片,UIImagePNGRepresentation() 返回的数据量大小为199K,而 UIImageJPEGRepresentation(UIImage* image, 1.0) 返回的数据量大小只为 140KB,比前者少了50多KB。如果对图片的清晰度要求不高,还可以通过设置 UIImageJPEGRepresentation 函数的第二个参数,来降低图片数据量。

如果还有什么问题可以继续百度,这里不进行过多赘述。

 

2.首先*个参数是我们都知道的图片image,但是第二个参数scale,一个0~1的浮点型比率,你以为0就是没有,压缩到0b大小,1.0就是原图大小?

答案是:错!首先你的图片的大小是根据(图片的宽*图片的高*每一个色彩的深度,这个和手机的硬件有关,一般是4)。其次,第二个参数苹果官方并没有明确说明这个参数的具体意义。对于大图片来说,即使你的scale选的很小,比如:0.0000000(n个0)001,但是得到的结果还是很大,这里做了一个实验:一个10M左右的图片,处理后大小为2M多。有点像是“压不动”的感觉。当然如果是小图片的话那就是没问题,能满足你的希望的压缩到的大小。

 

既然是循环压,那么就要说一下算法。考虑到递归,二分法,后来发现网上也是有的,二分法处理:更快一点压缩图片到指定的大小。先看一段代码:

//二分*大10次,区间范围精度*大可达0.00097657;*大6次,精度可达0.015625
for (int i = 0; i < 10; ++i) {
compression = (max + min) / 2;
imageData = UIImageJPEGRepresentation(image, compression);
//容错区间范围0.9~1.0
if (imageData.length < fImageBytes * 0.9) {
min = compression;
} else if (imageData.length > fImageBytes) {
max = compression;
} else {
break;
}
}
上面就是使用二分法进行处理,比for循环依次递减“高效”很多,而且也合理很多。

这样压缩到“*致”(一般我们不用进行太多的for循环,个人觉得参数到0.05已经可以了如果还是比你想要的大很多那就不要用UIImageJPEGRepresentation了),劳民伤财,劳的是cpu的高速运转,伤的是手机老化加快。哈哈,皮一下!

 

3.上面也提到了压缩“压不动”怎么办?

我们其实可以换一个方式,进行尺寸压缩:

提到尺寸压缩,你会不会很失望,看你的文章,原来也是使用UIGraphicsBeginImageContextWithOptions然后drawInRect绘制一个图片大小。

代码类似如下:

/* 根据 dWidth dHeight 返回一个新的image**/
– (UIImage *)drawWithWithImage:(UIImage *)imageCope Size:(CGSize)size {
//这里设置为0,意为自动设置清晰度,图片可以是别的传过来的图片信息
UIGraphicsBeginImageContextWithOptions(size, NO,0);
[imageCope drawInRect:CGRectMake(0, 0, size.width, size.height)];
imageCope = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return imageCope;
}
 

首先我需要说一下这个绘制很耗内存性能的,[UIImage drawInRect:]在绘制时,先解码图片,再生成原始分辨率大小的bitmap,这是很耗内存的,并且还有位数对齐等耗时操作。如果在一个方法中循环压缩比例进行代码的比例压缩,那么这种使用UIKit类进行图片绘制的话是需要先把图片读入内存然后在进行绘制,那么势必会给内存中占用大量的临时内存bitmap,而这个如果再加上循环,那么内存占有将是不可估量的。

 

4.你可能会说,我加一个自动释放池@autoreleasepool,不就好了?

错:首先这个自动释放池@autoreleasepool不要放在循环的外面,包着这个循环,原因就不过多说明,可以自行百度。然后放在for循环内部包着这个绘制的方法,你的内存并不是画完就得到了释放,内存占有的情况可以得到缓解,但是还是不能解决内存突然暴增的问题。尤其是大图片的压缩尤其明显。

 

下面就整体说明一下使用过程中的方案:

1.直接压缩图片(直接靠图片尺寸压缩绘制图片):

+ (void)compressedImageFiles:(UIImage *)image imageKB:(CGFloat)fImageKBytes imageBlock:(ReturnCompressImage)block {

__block UIImage *imageCope = image;
CGFloat fImageBytes = fImageKBytes * 1024;//需要压缩的字节Byte
__block NSData *uploadImageData = nil;

//        uploadImageData = UIImagePNGRepresentation(imageCope);
uploadImageData = UIImageJPEGRepresentation(imageCope, 1.0);
//    NSLog(@”图片压前缩成 %fKB”,uploadImageData.length/1024.0);
//    CGFloat value1 = uploadImageData.length/1024.0;

CGSize size = imageCope.size;
CGFloat imageWidth = size.width;
CGFloat imageHeight = size.height;

if (uploadImageData.length > fImageBytes && fImageBytes >0) {

dispatch_async(dispatch_queue_create(“CompressedImage”, DISPATCH_QUEUE_SERIAL), ^{

/* 宽高的比例 **/
CGFloat ratioOfWH = imageWidth/imageHeight;
/* 压缩率 **/
CGFloat compressionRatio = fImageBytes/uploadImageData.length;
/* 宽度或者高度的压缩率 **/
CGFloat widthOrHeightCompressionRatio = sqrt(compressionRatio);

CGFloat dWidth   = imageWidth *widthOrHeightCompressionRatio;
CGFloat dHeight  = imageHeight*widthOrHeightCompressionRatio;
if (ratioOfWH >0) { /* 宽 > 高,说明宽度的压缩相对来说更大些 **/
dHeight = dWidth/ratioOfWH;
}else {
dWidth  = dHeight*ratioOfWH;
}

imageCope = [self drawWithWithImage:imageCope width:dWidth height:dHeight];
//            uploadImageData = UIImagePNGRepresentation(imageCope);
uploadImageData = UIImageJPEGRepresentation(imageCope, 1.0);

//            NSLog(@”当前的图片已经压缩成 %fKB”,uploadImageData.length/1024.0);
//微调
NSInteger compressCount = 0;
/* 控制在 1M 以内**/
while (fabs(uploadImageData.length – fImageBytes) > 1024) {
/* 再次压缩的比例**/
CGFloat nextCompressionRatio = 0.9;

if (uploadImageData.length > fImageBytes) {
dWidth = dWidth*nextCompressionRatio;
dHeight= dHeight*nextCompressionRatio;
}else {
dWidth = dWidth/nextCompressionRatio;
dHeight= dHeight/nextCompressionRatio;
}

imageCope = [self drawWithWithImage:imageCope width:dWidth height:dHeight];
//                uploadImageData = UIImagePNGRepresentation(imageCope);
uploadImageData = UIImageJPEGRepresentation(imageCope, 1.0);

/*防止进入死循环**/
compressCount ++;
if (compressCount == 10) {
break;
}
}

//            NSLog(@”图片已经压缩成 %fKB”,uploadImageData.length/1024.0);
//            CGFloat value2 = uploadImageData.length/1024.0;

imageCope = [[UIImage alloc] initWithData:uploadImageData];
dispatch_sync(dispatch_get_main_queue(), ^{
if (block) {
block(imageCope);
}
});
});
} else{
if (block) {
block(imageCope);
}
}
}

/* 根据 dWidth dHeight 返回一个新的image**/
+ (UIImage *)drawWithWithImage:(UIImage *)imageCope width:(CGFloat)dWidth height:(CGFloat)dHeight{
UIGraphicsBeginImageContext(CGSizeMake(dWidth, dHeight));
[imageCope drawInRect:CGRectMake(0, 0, dWidth, dHeight)];
imageCope = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return imageCope;
}
循环压运行时截图:

%title插图%num

缺点:如上图的结果看到的这种方式使用了UIKit的UIGraphicsBeginImageContext方案来绘制图案,内存占用也是比较严重的。

优点:使用了内存的压缩率比值来进行压缩,手机的cpu消耗会相对来说比较小。

 

2.使用Image I/O相关的处理方式,使用相关的生成缩略图的形式压缩图片文件。

#pragma mark – UIImagePickerControllerDelegate
– (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
NSLog(@”info:\n%@”, info);
UIImage *image = info[UIImagePickerControllerOriginalImage];
NSData *imgData = UIImageJPEGRepresentation(image, 1.0);
NSLog(@”length1: %lu”, (unsigned long)imgData.length);

NSURL *imageURL = info[UIImagePickerControllerReferenceURL];
ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
[assetsLibrary assetForURL:imageURL resultBlock:^(ALAsset *asset) {
image = [self thumbnailForAsset:asset maxPixelSize:600];
imgData = UIImageJPEGRepresentation(image, 1.0);
NSLog(@”length2: %lu”, (unsigned long)imgData.length);
NSArray * paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@”new/ceshi.jpg”];// 保存文件的名称

BOOL result = [imgData writeToFile: filePath atomically:YES]; // 保存成功会返回YES

NSLog(@”文件保存成功?%d”,result);
} failureBlock:nil];

[picker dismissViewControllerAnimated:YES completion:^{
}];
}
– (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((void *)CFBridgingRetain(rep), [rep size], &callbacks);
CGImageSourceRef source = CGImageSourceCreateWithDataProvider(provider, NULL);
CGImageRef imageRef = CGImageSourceCreateThumbnailAtIndex(source, 0, (__bridge CFDictionaryRef) @{
(NSString *)kCGImageSourceCreateThumbnailFromImageAlways : @YES,
(NSString *)kCGImageSourceThumbnailMaxPixelSize : @(size),
(NSString *)kCGImageSourceCreateThumbnailWithTransform : @YES,
});
CFRelease(source);
CFRelease(provider);
if (!imageRef) {
return nil;
}
UIImage *toReturn = [UIImage imageWithCGImage:imageRef];
CFRelease(imageRef);
return toReturn;
}
使用ImageIO接口,避免在改变图片大小的过程中产生临时的bitmap,就能够在很大程度上减少内存的占有从而避免由此可能导致的app闪退问题。

 

思路整理:

综合上面的所有情况现在我的*终处理方案如下:

1.首先使用UIImageJPEGRepresentation进行尽可能的压缩,这里我使用二分法(考虑到手机性能问题,这里二分法设置10次(能精确到0.00097657)以内即可)处理压缩的比率参数。

2.其次根据我设置的二分法的*小可能压缩一下原图片信息,比对一下*小的二分法能处理的*大限度得到的*小图片信息能否满足条件(在你设定的目标大小以内)。以减少不必要的循环,保护cpu处理。

3.然后对处理后的图片信息,保留*大压缩比(即上面的*小二分法的scale结果),然后再进行和*终目标的大小比值,求根,然后对图像的宽和高等比压缩处理。然后再次根据*小二分法的scale以UIImageJPEGRepresentation读取结果再和你的目标大小比对,然后以此循环。直到大小小于目标大小为止。

 

这样得到的图片几乎就能够在你设定的大小以内的附近,而且图片的信息肉眼几乎看不出来多大的区别。亲自试了3M,4M,6M,10M的大图片没有发现内存消耗有太大的波动。而且压缩出来的图片清晰度很高。

 

这里上代码如下:

– (void)compressedImageFiles:(UIImage *)image
imageKB:(CGFloat)fImageKBytes imageBlock:(void(^)(NSData *imageData))block{
//二分法压缩图片
CGFloat compression = 1;
NSData *imageData = UIImageJPEGRepresentation(image, compression);
NSUInteger fImageBytes = fImageKBytes * 1000;//需要压缩的字节Byte,iOS系统内部的进制1000
if (imageData.length <= fImageBytes){
block(imageData);
return;
}
CGFloat max = 1;
CGFloat min = 0;
//指数二分处理,s首先计算*小值
compression = pow(2, -6);
imageData = UIImageJPEGRepresentation(image, compression);
if (imageData.length < fImageBytes) {
//二分*大10次,区间范围精度*大可达0.00097657;*大6次,精度可达0.015625
for (int i = 0; i < 6; ++i) {
compression = (max + min) / 2;
imageData = UIImageJPEGRepresentation(image, compression);
//容错区间范围0.9~1.0
if (imageData.length < fImageBytes * 0.9) {
min = compression;
} else if (imageData.length > fImageBytes) {
max = compression;
} else {
break;
}
}

block(imageData);
return;
}

// 对于图片太大上面的压缩比即使很小压缩出来的图片也是很大,不满足使用。
//然后再一步绘制压缩处理
UIImage *resultImage = [UIImage imageWithData:imageData];
while (imageData.length > fImageBytes) {
@autoreleasepool {
CGFloat ratio = (CGFloat)fImageBytes / imageData.length;
//使用NSUInteger不然由于精度问题,某些图片会有白边
NSLog(@”>>>>>>>>>>>>>>>>>%f>>>>>>>>>>>>%f>>>>>>>>>>>%f”,resultImage.size.width,sqrtf(ratio),resultImage.size.height);
CGSize size = CGSizeMake((NSUInteger)(resultImage.size.width * sqrtf(ratio)),
(NSUInteger)(resultImage.size.height * sqrtf(ratio)));
//            resultImage = [self drawWithWithImage:resultImage Size:size];
//            resultImage = [self scaledImageWithData:imageData withSize:size scale:resultImage.scale orientation:UIImageOrientationUp];
resultImage = [self thumbnailForData:imageData maxPixelSize:MAX(size.width, size.height)];
imageData = UIImageJPEGRepresentation(resultImage, compression);
}
}

//   整理后的图片尽量不要用UIImageJPEGRepresentation方法转换,后面参数1.0并不表示的是原质量转换。
block(imageData);

}
– (UIImage *)thumbnailForData:(NSData *)data maxPixelSize:(NSUInteger)size {
CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
CGImageSourceRef source = CGImageSourceCreateWithDataProvider(provider, NULL);

CGImageRef imageRef = CGImageSourceCreateThumbnailAtIndex(source, 0, (__bridge CFDictionaryRef) @{
(NSString *)kCGImageSourceCreateThumbnailFromImageAlways : @YES,
(NSString *)kCGImageSourceThumbnailMaxPixelSize : @(size),
(NSString *)kCGImageSourceCreateThumbnailWithTransform : @YES,
});
CFRelease(source);
CFRelease(provider);

if (!imageRef) {
return nil;
}

UIImage *toReturn = [UIImage imageWithCGImage:imageRef];

CFRelease(imageRef);

return toReturn;
}
运行的中进行的结果状态:

%title插图%num

综合以上对比,目前这种压缩方案无论是在内存方面还是cpu的使用方面都是很有优势,很好的能够避免因为压缩大图片导致的app闪退问题(因为循环呀大图片都是没有问题的)。

demo地址:https://github.com/KirstenDunst/CSXImageCompress

文章地址:https://blog.csdn.net/BUG_delete/article/details/84636899

demo里面我是做了批量压缩处理,对于多个大图处理,内存也是没有什么太大的波动的。这里附上demo中的批量压缩的图片存储路径:

%title插图%num

得到new文件里面的图片经过压缩的都在490kb至499kb范围之间(尽可能接近我们限定的值),图片清晰度也很高。

如有问题,欢迎指正!这里也奉献一些大图(6M,10M)以供测试:https://pan.baidu.com/s/13eexiBPy_lyJxBLXIddnZw

 

后续补充:

之前的测试中有发现使用上面demo中的方法有遇到iphone手机内存不足的手机拍的照片没有问题,再进行compressedImageFiles压缩处理的时候,会得到  “糊掉的”  图片,之后经过处理,在图片进行二分法压缩前,进行了一次图片的重绘操作解决了这个问题。以上的demo工具中的另一个方法resetSizeOfImage:能够解决这个问题。

 

扩展:

其实上面的demo中提到的Quartz2D或者UIKit的类中对图片的压缩,水印,剪切等操作,当看过CoreGraphics之后觉得图片原来也可以这么玩。它是iOS的核心图形库,包含Quartz2D绘图API接口,常用的是point,size,rect等这些图形,都定义在这个框架中,类名以CG开头的都属于CoreGraphics框架,它提供的都是C语言函数接口,是可以在iOS和mac OS 通用的。刚接触,这里的了解并不是很深入,但是是更接近底层的图像处理,操作处理上面也是有着很大的灵活性,也有可能会解答iphone内存不足遇到的压缩图片需要重绘问题。之后有时间我会再次整理一篇CoreGraphics的图片处理文章,敬请期待吧!

 

云计算技术优势和商业优势是什么,主要有哪些特点?

近年来,对于打造高度可扩展的应用程序,软件架构师们挖掘了若干相关理念,并以*佳实践的方式加以实施。在今天的“信息时代”,这些理念更加适用于不断增长的数据集,不可预知的流量模式,以及快速响应时间的需求。

在云中构建应用程序有一些明显的商业优势,这里列出几个主要特点:

1、前期基础设施投资几乎为零:如果你要建立一个大型的系统,它可能需要大量投资用于于机房,物理安全,硬件(机架,服务器,路由器,备用电源),硬件管理(电源管理,散热),和运维人员。由于高昂的前期成本,该项目通常甚至开始之前需要多轮的管理审批和论证。现在,采用公有云环境,几乎没有固定成本或启动成本。

2、基础设施即时性:在过去,如果你的应用程序开始大规模上量,而你的系统或基础设施没有在规模上跟上来,将会*大影响应用的成功。相反,如果前期投入了大量资金,而应用没有得到普及,你的系统或基础设施又将成为失败的牺牲品。通过在云环境自适应部署应用程序,就可以不必担心是否要预先采购大型的系统。这增加了灵活性,降低了风险和运营成本,因为你可以根据用于成长的规模而按需支付费用。

3、更有效地利用资源:系统管理员通常会担心新硬件的采购(资源耗尽的情况)和更高的基础设施利用率(资源冗余余或闲置的情况)。在云环境中,我们可以根据该应用程序请求量更高效地管理资源以及有效地按需释放资源。

4、根据使用计算成本:用工具式的定价,可以只对已使用的基础设施付费而不必支付那些分配了但未使用的基础设施。这增加了一个节省成本的新维度。当部署了优化补丁来更新云应用时,你可以立竿见影地看到成本节约(有时会提前出现在下个月的账单里)。例如,如果一个缓存层可以减少70%的数据请求,你马上就可以在下一个账单里看到回报。此外,如果您正在云上构建一个平台,同样可以把这个灵活可变的基于使用的成本结构传递给自己的客户。

5、缩短产品上市时间:并行化是加快处理速度的重要方式。如果一个计算密集型或数据密集型任务在一台机器上并行处理需要运行500小时,通过云架构,能够复制并运行500个实例来处理相同的任务,并在1小时内完成。具有弹性的基础设施提供了利用并行化的成本效益来缩短产品上市时间的能力。

另外一方面是云计算的技术优势,可以简单归纳为如下几个方面:

1、自动化:“脚本化的基础设施”:可以通过充分利用可编程(API驱动的)基础设施,可重用构建和部署系统。

2、自动扩展:无需任何人工干预,就可以根据需求对应用进行双向扩展。自动缩放提高了自动化程度从而更加高效。

3、主动扩展:基于需求预期和流量模式的合理规划,可以对应用进行双向扩展让从而保持低成本运营。

4、更有效的开发周期:可以很容易地克隆开发和测试环境到生产系统。不同阶段的环境可以很容易地推广到生产系统。

5、改进的可测性:不需要进行硬件耗尽的测试。注入和自动化测试能够持续在开发过程的每一个阶段。我们可以建立一个预配置环境——“即时测试实验室”,仅用于一段时间的测试。

6、灾难恢复和业务连续性:云服务为维护一系列DR服务器和数据存储提高了低成本选择。使用云服务,你可以在几分钟内完成将某一地点的环境复制到其他地域的云环境中。

7、流量溢出到云环境:通过几次点击和有效的负载均衡策略,可以创建路由将超出的访问流量转移到云环境中的一个完整的防溢应用程序。

云计算强化了构建高度可扩展互联网架构的一些基本理念,同时引入了一些新的概念完全该变量应用的构建和部署方式。因此,当你在从概念设计到实施的过程中,你可能会感到“什么都变了,却又没什么不同”。云计算改变了处理方式,模式,实践方式,甚至哲学理念,同时强化了传统的SOA原则,这些原则比以前更加重要。

云计算在商业智能运用中,主要存在哪些难点?

在数据分析与商业智能分析中应用云计算技术,能提高数据分析的效率,让企业更加能适应快速变化的市场,为快速推出新的产品提供数据依据,但是云计算也存在一些难点和风险。

(1)产品选择问题

服务器虚拟化技术和产品没有统一的标准平台和开放协议,业内服务器虚拟化产品良莠不齐,选择不合适的产品会带来严重的投资风险。而且服务器虚拟化软件价格不菲,短期、小范围内的应用难见效益。

(2)可靠性问题

由于在一台服务器上运行多个重要的应用程序和数据库,虚拟化的IT环境比大型计算机和微型计算机环境更容易遭到灾难性崩溃的破坏,因为它们有同样集中的资源,但是,硬件的可靠性不同。

(3)数据安全问题

数据是企业的生命,数据的丢失和泄露对电信来说是不容忽视的风险。云计算带来便利的同时,也给数据带来了风险。

(4)环境的复杂化

虚拟化的本质是应用只与虚拟层交互,而与真正的硬件隔离。在造成便利的同时,也造成了风险。软件和硬件之间被切断联系将导致安全人员看不到设备背后发生的风险,服务器环境变得更加不同定、复杂,安全人员*终失去硬件本身提供的稳定性。当应用出现故障时,需要精确定位是硬件还是软件故障,在虚拟化世界中,这将是一项复杂而冗长的工作。

企业使用云平台,存在的三个问题

在今天大多数企业都在采用云技术平台,社会开始重新思考如何通过云来沟通,数据爆炸带来了对云平台新的见解。当然所有企业在和云打交道时,都不可避免会有一些疑虑,数据专家认为,以下三个问题是所有企业都应该问到和思考的问题:

所有企业都应该问三个问题

1.你能相信你的业务关键应用程序或信息吗?

云是一个千载难逢的技术进步,企业正在借助云的力量来改造他们的业务—云计算可以帮助加速创新,创建新的业务场景,加快上市时间,或者开车节省成本等。

2.选择什么样的云平台?

选择什么样的云平台一直是企业关心的问题,是私有云、公有云还是混合云?其实不同企业有不同企业的路线图,适合自己企业的就是*好的。单一的解决方案无法满足所有需要。

3.企业如何处理对云服务的信任问题?

信任对于大企业来说是个大问题,你的数据和服务能得到很好的保护吗?你的机密信息在云服务上是否时安全的?这些都需要企业充分权衡考虑。

Linux日常 之 把自己的电脑做成一个微型服务器

如何把自己的电脑做成一个微型的服务器呢?

目前知道两种方法

Python

python -m SimpleHTTPServer #Python2
python -m http.server #python3
1
2
默认端口8000,这是单线程访问.
使用方法

1.浏览器直接 输入你的本机IP地址,加上端口号8000

111.222.3.1:8000

2.传输文件的话,也可以用wget 命令

wget 111.222.3.1:8000/yourfile

ngix

安装ngix

sudo apt install ngix

配置ngix

找到 ngix安装目录 然后 在/etc/nginx/sites-available/default 文件修改server字段中的内容如下:

location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
autoindex on; #新添加的,自动index
try_files $uri $uri/ =404;
}

使用方法
我们可以将要分享的东西放在某个文件夹,然后通过软链接到 /var/www/html这个目录下.

例如 我在home目录下,新建一个文件夹shared,然后链接到上面那个目录下

sudo ln -s /home/yourdir/Shared/ share
1
那么效果如下

​1. 你本机中的shared 文件夹
%title插图%num

​2.经过软链接之后,你可以在浏览器输入你的电脑的IP地址,然后可见

%title插图%num

动手搭建自己的web服务器

先传两张效果图:

%title插图%num%title插图%num

下面进入正题。

简介:该架构是建立在本人之前写的服务器ifserver上开发而来,主要采用js和html,推荐使用js,也可以用jsp,目前用于公司的后台管理,先开源供大家学习和参考。

构建步骤如下:

1 安装jdk 1.8(注意不要在安装目录中还有空格和特殊字符),安装ant 1.9.3以上,path中配置java和ant的环境变量,ant:你的ant安装目录\bin,你的jdk安装目录\bin,你的jdk安装目录\jre\bin,这三个配置好了在cmd控制台输入java -version 和 ant -version。

2 前往“码云”使用git客户端clone ifserver代码,链接:https://gitee.com/lastcoder/ifserver.git ,不会git赶紧右上角点X。

%title插图%num

3 clone完成以后,打开dos控制台,

cd进入ifserver/build目录,输入 ant  ifserver,这里就开始编译服务器代码,看到“BUILD SUCCESSFUL”表示编译成功,然后会在ifserver目录下生成一个worker和target目录,target目录就是编译完成后的服务器。

cd回到ifserver/build目录,输入 ant plugin -Dplugin fzxyweb,其中plugin是ant中的任务,-Dplugin表示参数名 fzxyweb表示参数,告诉ant中的plugin任务 去编译src/plugin中的fzxyweb插件。

4 进入target/ifserver/bin目录,双击打开ifserver.bat,启动服务器。

5 在浏览器中输入http://127.0.0.1:6000 即可。

 

ftp上传错误,提示:打开FTP服务器上的文件夹时发生错误,请检查是否有权限访问该文件夹。

使用FTP上传数据的时候,经常会遇到“打开FTP”无权限的提示,这是由于浏览器设置了防火墙的缘故,下面是正确的设置流程:
1. 首先打开一个IE浏览器(如果打开了多个浏览器,请关闭)。
2.点击打开“工具”—“internet选项”—“高级”
3.找到使用被动FTP(为防火墙和DSL调制解调器兼容性),并把前面的勾去掉。
4. 然后点击确定并且关闭IE浏览器。
5. 打开“我的电脑”,在地址栏里输入ip 回车,会弹出对话框,要求输入用户名和密码,输入用户名和密码后,就可以把您的压缩文件复制到ftp里了。下面是使用ftp软件flashFxp来上传得使用方法。
1. 首先打开软件 打开“选项”—“参数设置”—“代理”,把“使用被动模式”的勾去掉,确定。
2.点击右侧闪电图标,出现 在服务器栏输入ip 然后输入用户名和密码,然后点击连接就可以了。软件左侧为您的本机,右侧为服务器,把您要上传得数据帐套拖动到右侧就可以了

拷贝文件到服务器 提示FTP文件夹错误

FTP文件夹错误
将文件复制到FTP服务器时发生错误。请检查是否有权限将文件放到该服务器上。
详细信息:
200 Type set to I.
227Entering Passive Mode (122,114,49,4,4,87).
125 Data connection already open;Transfer starting.
426 Connection closed;transfer aborted.

之前更新网站的时候遇到过这个问题,而且问题比较奇怪,一个网站可以更新,另一个网站提示这个不行。
因为我还有个专门打发票的电脑,用那台xp的电脑有时候可以复制更新上,所以我就传送文件到那台电脑上,然后拷贝进去。
后来有时候遇到两台电脑都有问题,在网上搜了下解决方法,貌似又一次以下这个方法解决了:
1.打开“Internet选项”,选择“高级”选项卡,在设置中把“使用被动FTP(用于防火墙和DSL调制解调器的兼容)”前面的勾去掉,并点击“确定”退出“Internet属性”。

但是*近我发现,以前用的这两个方法,换电脑和设置浏览器属性,可能都只是巧合,因为*近我又遇到了这个问题,更新网站时又提示这个,然后我想到以前写过博文,貌似设置什么属性解决了,但是没有找到这个博文,所以又上网搜了搜,没有找到什么有用的方法。
还是一个网站可以更新,另一个网站FTP复制不上,我又进一步对比测试了下,现象如下:
1.一个网站可以登入FTP更新,一个网站不行。
2.两台电脑都是一个网站可以,另一个网站不行。
3.有问题的网站,从网站上拷贝东西下来,上传不行。
4.我在有问题的网站上,上传一个简单的txt文本,发现文本居然可以拷贝上去,而且不提示这个。

所以我想可能和文件的大小有关,因为我拷贝的是安装文件的压缩包,难道和服务器的储存量有关,所以我删了一些历史下载文件包,然后拷贝,竟然可以上传了。

所以该提示现象的原因应该是这个,因为我试了很多次,但是一删除腾出空间来,就有效果了。
1.有的网站可以更新,有的网站不行;不同电脑也是,有问题的网站不行。
2.拷贝下来可以,上传不行。
3.上传小东西可以,上传大东西不行。
如果有以上三个现象,很可能就是这个原因,找到原因以后就好处理了。
删除部分网站上的文件(不需要的历史文件),再拷贝进去新的文件就不会报错了。

打开ftp服务器上的文件夹时发生错误解决方法

使用FTP上传数据的时候,经常会遇到“打开FTP”无权限的提示,这是由于浏览器设置了防火墙的缘故,下面是正确的设置流程:

1. 首先打开一个IE浏览器(如果打开了多个浏览器,请关闭)。

2.点击打开“工具”—“internet选项”—“高级”

3.找到使用被动FTP(为防火墙和DSL调制解调器兼容性),并把前面的勾去掉。

4. 然后点击确定并且关闭IE浏览器。

5. 打开“我的电脑”,在地址栏里输入ip 回车,会弹出对话框,要求输入用户名和密码,输入用户名和密码后,就可以把您的压缩文件复制到ftp里了。

下面是使用ftp软件flashFxp来上传得使用方法。

1. 首先打开软件 打开“选项”—“参数设置”—“代理”,把“使用被动模式”的勾去掉,确定。

2.点击右侧闪电图标,出现 在服务器栏输入ip 然后输入用户名和密码,然后点击连接就可以了。软件左侧为您的本机,右侧为服务器,把您要上传得数据帐套拖动到右侧就可以了。

云计算的云安全问题,主要应该怎么解决

在云观念下实施的现代技术,正在以矫健并*具增长空间的态势来满足各种企业业务的发展。但算在被人们接受的过程中,会受到来自的考验。*为常见的SaaS、PaaS、IaaS云服务,也成为了在相对安全的标准模式下的云服务类型。

但在云计算环境中,是不存在一套标准的云规范来约束各方。在本文,将会为大家介绍围绕云安全的七大类型问题。

1、网络安全

网络安全包括云基础架构下的网络通信和配置。为了解决云服务中的相关网络安全问题,需要在现有的内部网络中采用相关的隐藏处理和部署流程,让本地的网络安全政策延伸到远程的网络平台:

通信安全:*(VirtualPrivateNetwork)机制需要确保分布式架构云安全,避免来自窃听、调用工具、中间人等多种攻击手段造成的威胁。随着海量资源的分享和大规模虚机的部署、同步,会使得分布式架构面临不断增长的安全风险。

防火墙:服务提供商的云基础设施,可以通过创建防火墙来抵御内外部的安全威胁,防火墙应该具备:

·隔离虚机

·端口地址的过滤

·预付DoS攻击

·检测外部安全

安全配置:协议、系统和技术的使用应该要合理配置,以满足安全和隐私的必须要求。

2、接口

使用云服务需要有一个云接口。这种接口负责用户、管理员、编程接口等一系列访问通道的连接。

API:编程接口(尤其对于IaaS和PaaS云服务来说)必须抵御恶意软件的侵袭,以确保资源的有效共享。

管理接口:在IaaS模式中它远程控制这各种资源,控制PaaS环境下的代码、部署和测试。另外,它还控制SaaS的用户访问和应用配置。

用户接口:为了确保环境安全,用户接口还扮演了终端用户接口的角色。

授权:访问云服务通常需要经过某种形式的授权。这些授权机制要考虑到安全规则,以及在虚拟化环境中冗余遭受攻击的漏洞风险等情形。

3、数据安全

保护数据安全是*基本的要求。数据必须加密处理,而且只能面向授权用户群开放。

加密:加密是*为常见的实现数据安全的方法。几乎每个组织机构都会使用,而且这种使用也有很长的历史渊源。

冗余:这种方法可以确保数据丢失带来的风险。目前,也有很多商业机构采用这种方法应用到IT服务中,而且它们也往往很依赖这种方式。

清理:清理数据常作为一种删除的方式来实现。完全毁坏的数据包括登陆日志、秘密备份注册,在云技术中的这些内容都应该彻底清理。

4、虚拟化

这里的虚拟化包括开发云环境中的各种虚拟化技术。虚拟化往往会和虚机管理联系起来,而且也容易暴露虚机管理上的漏洞。

隔离:因此云环境下无论硬件还是软件资源,都是在虚机之间共享的,因此容易带来数据泄露和跨VM攻击。尽管每个虚机都是相互隔离的,但仍会面临不少安全威胁,因为每个资源都是共享内存、架构平台的。

Hypervisor漏洞:虚机的主要构成就是Hypervisor,也就是虚机管理平台VMM。Hypervisor安全漏洞十分普遍。

数据泄露:如果说在虚拟架构隔离控制解决方案中有什么缺点的话,那就应该是数据泄露了。

VM诊断:为了安全问题,有必要对每个使用的虚机都进行诊断,以确定其工作的流程和状态。

跨VM攻击:任何一个虚机暴露在外被攻击,都会引来一连串的影响,让其他相关的虚机也遭受劫持。

5、控制

在云计算环境下,容易失去管理员和安全方面管控的问题都应该分类、控制。

数据控制:数据冗余、文件系统和其他相关配置的信息,将从所有者手中游离到云端。

安全控制:如果有对服务提供商任何不满意的SLA服务水平协议,可能会出现安全机制和正常不在自己控制范围内的情况发生。失去控制的情形应该限定在客户端,并对其进行单独测试。

锁定:由于标准化良好的建立会带来服务商短板的出现,也就是依赖单个平台出现的锁定。

6、规范

规范是一个有关服务可访问和功能配备要求的总括,它应该包括以下内容:

SLA:也就是服务水平协议,需要有一套机制来确保*基本的安全需要,服务的可用性也应该在SLA中有所涉及。

审计:顾客、提供商和第三方成员要能遵守安全和服务指派,以实现透明化、公开化。比如公开的API就可以帮助解决这些问题并自动涉及和扮演相关角色。

服务确认:基于SLA满足客户基本合约的完整服务,应该要得到确认。

7、法律问题

该问题涉及到仲裁和法律相关议题。比如数据所处的位置、证据链、服务商的资质等。