皮皮网

【题库api网站源码】【前端通用框架源码】【外部窗口嵌入源码】createzip源码

时间:2024-11-19 07:42:47 来源:jq 源码 作者:溯源码精品燕盏

1.createzipԴ??
2.php下载官网?
3.c#压缩解压 文件夹

createzip源码

createzipԴ??

       文件处理一直都是前端人的心头病,如何控制好文件大小,文件太大上传不了,文件下载时间太长,tcp直接给断开了?等

效果

       为了方便大家有意义的学习,这里就先放效果图,题库api网站源码如果不满足直接返回就行,不浪费大家的时间。

文件上传

       文件上传实现,分片上传,暂停上传,恢复上传,文件合并等

文件下载

       为了方便测试,前端通用框架源码我上传了1个1g的大文件拿来下载,前端用的是流的方式来保存文件的,具体的可以看这个apiTransformStream

正文

       本项目的地址是:/post/

       requestIdleCallback有不明白的可以看这里:/post/

       接下来咋们来计算文件的hash,计算文件的hash需要使用spark-md5这个库,

全量计算文件hashexportasyncfunctioncalcHashSync(file:File){ //对文件进行分片,每一块文件都是分为2MB,这里可以自己来控制constsize=2**;letchunks:any[]=[];letcur=0;while(cur<file.size){ chunks.push({ file:file.slice(cur,外部窗口嵌入源码cur+size)});cur+=size;}//可以拿到当前计算到第几块文件的进度lethashProgress=0returnnewPromise(resolve=>{ constspark=newSparkMD5.ArrayBuffer();letcount=0;constloadNext=(index:number)=>{ constreader=newFileReader();reader.readAsArrayBuffer(chunks[index].file);reader.onload=e=>{ //累加器不能依赖index,count++;//增量计算md5spark.append(e.target?.resultasArrayBuffer);if(count===chunks.length){ //通知主线程,计算结束hashProgress=;resolve({ hashValue:spark.end(),progress:hashProgress});}else{ //每个区块计算结束,通知进度即可hashProgress+=/chunks.length//计算下一个loadNext(count);}};};//启动loadNext(0);});}

       全量计算文件hash,在文件小的时候计算是很快的,但是在文件大的情况下,计算文件的开源源码 网站hash就会非常慢,并且影响主进程哦?

抽样计算文件hash

       抽样就是取文件的一部分来继续,原理如下:

/***抽样计算hash值大概是1G文件花费1S的时间**采用抽样hash的方式来计算hash*我们在计算hash的时候,将超大文件以2M进行分割获得到另一个chunks数组,*第一个元素(chunks[0])和最后一个元素(chunks[-1])我们全要了*其他的元素(chunks[1,2,3,4....])我们再次进行一个分割,这个时候的分割是一个超小的大小比如2kb,我们取*每一个元素的易语言钢琴源码头部,尾部,中间的2kb。*最终将它们组成一个新的文件,我们全量计算这个新的文件的hash值。*@paramfile{ File}*@returns*/exportasyncfunctioncalcHashSample(file:File){ returnnewPromise(resolve=>{ constspark=newSparkMD5.ArrayBuffer();constreader=newFileReader();//文件大小constsize=file.size;letoffset=2**;letchunks=[file.slice(0,offset)];//前面2mb的数据letcur=offset;while(cur<size){ //最后一块全部加进来if(cur+offset>=size){ chunks.push(file.slice(cur,cur+offset));}else{ //中间的前中后去两个字节constmid=cur+offset/2;constend=cur+offset;chunks.push(file.slice(cur,cur+2));chunks.push(file.slice(mid,mid+2));chunks.push(file.slice(end-2,end));}//前取两个字节cur+=offset;}//拼接reader.readAsArrayBuffer(newBlob(chunks));//最后Kreader.onload=e=>{ spark.append(e.target?.resultasArrayBuffer);resolve({ hashValue:spark.end(),progress:});};});}

       这个设计是不是发现挺灵活的,真是个人才哇

       在这两个的基础上,咋们还可以分别使用web-worker和requestIdleCallback来实现,源代码在hereヾ(≧▽≦*)o

       这里把我电脑配置说一下,公司给我分的电脑配置比较lower,8g内存的老机器。计算(3.3g文件的)hash的结果如下:

       结果很显然,全量无论怎么弄,都是比抽样的更慢。

文件分片的方式

       这里可能大家会说,文件分片方式不就是等分吗,其实还可以根据网速上传的速度来实时调整分片的大小哦!

consthandleUpload1=async(file:File)=>{ if(!file)return;constfileSize=file.sizeletoffset=2**letcur=0letcount=0//每一刻的大小需要保存起来,方便后台合并constchunksSize=[0,2**]constobj=awaitcalcHashSample(file)as{ hashValue:string};fileHash.value=obj.hashValue;//todo判断文件是否存在存在则不需要上传,也就是秒传while(cur<fileSize){ constchunk=file.slice(cur,cur+offset)cur+=offsetconstchunkName=fileHash.value+"-"+count;constform=newFormData();form.append("chunk",chunk);form.append("hash",chunkName);form.append("filename",file.name);form.append("fileHash",fileHash.value);form.append("size",chunk.size.toString());letstart=newDate().getTime()//todo上传单个碎片constnow=newDate().getTime()consttime=((now-start)/).toFixed(4)letrate=Number(time)///速率有最大和最小可以考虑更平滑的过滤比如1/tanif(rate<0.5)rate=0.5if(rate>2)rate=2offset=parseInt((offset/rate).toString())chunksSize.push(offset)count++}//todo可以发送合并操作了} ATTENTION!!!?如果是这样上传的文件碎片,如果中途断开是无法续传的(每一刻的网速都是不一样的),除非每一次上传都把chunksSize(分片的数组)保存起来哦

控制/post/

php下载官网?

       phpweb怎么下载

       1、在浏览器中搜索PHP,进入php官网。

       2、点击Downloads选项,进入下载页面。

       3、选择一个适合的PHP版本,然后点击页面中的Windowsdownloads。

       4、点击zip按钮,再点击下载按钮即可。

如何在本地机上看php

       å‡†å¤‡å·¥ä½œé¦–先要下载如下软件,推荐到官网下载,如果你是像我一样只是测试,那么到skycn.com下载吧,这样比较快。

       Apache

       æœ€æµè¡Œçš„HTTP服务器软件之一。快速、可靠、可通过简单的API扩展,Perl/Python解释器可被编译到服务器中,完全免费,完全源代码开放。

       æˆ‘下载的是forWindows版本,目前最新版本是:2.0.

       PHP

       PHP是一种HTML内嵌式的语言。而PHP独特的语法混合了C、Java、Perl以及PHP式的新语法。它可以比CGI或者Perl更快速的执行动态网页。

       æˆ‘下载的是forWindows版本,目前最新版本是:5.0.4

       MySQL

       æ˜¯ä¸€ä¸ªå¤šçº¿ç¨‹çš„,结构化查询语言(SQL)数据库服务器。SQL在世界上是最流行的数据库语言。MySQL的执行性能非常高,运行速度非常快,并非常容易使用。

       æˆ‘下载的是forWindows版本,目前最新版本是:5.0.4Beta

       phpMyAdmin

       phpMyAdmin是一个用PHP编写的,可以通过互联网控制和操作MySQL。通过phpMyAdmin可以完全对数据库进行操作。

       æˆ‘下载的是forWindows版本,目前最新版本是:2.6.2-pl1

       å®‰è£…apache和PHP

       ä¸‹é¢æ˜¯æˆ‘的安装记录:

       é€‰æ‹©ç«¯å£ï¼Œå°†apache安装在e:\apache下。

       é…ç½®apache里的mended,重命名为php.ini并拷贝到windows目录下。

       NTFS上记得给服务器开PHP.ini的读权限。

       æŸ¥æ‰¾extension_dir后面的改为e:/php/ext

       æŸ¥æ‰¾WindowsExtensions,把下面有一排的;extension=php_***.dll的分号去掉,就是支持组件了。我把extension=php_gd2.dllextension=php_mbstring.dllextension=php_mysql.dll的分号去掉了。

       php5默认不支持mysql了,所以要为他添加支持,除了extension=php_mysql.dll去分号之外,在php目录里有个libmysql.dll文件,把它复制到系统的system文件夹下,复制php.ini到windows目录下。

       æ­¤æ—¶PHP环境基本已经配置成功

       åœ¨WEB根目录里建一个名为test.php的文件内容如下

echophpinfo();?

       é‡æ–°å¯åŠ¨apache服务,用浏览器打开

       å¦‚果可以看到php配置输出信息就成功了

       å®‰è£…mysql

       å°†mysql安装到指定目录,然后安装程序会引导你一步步配置。不过奇怪的是最后任务栏没有出现Mysql的图标。

       ä¿®æ”¹mysql数据库的root密码

       ç”¨cmd进入命今行模式输入如下命令:(注:d:\mysql为mysql安装目录)

       cdd:\mysql\bin

       mysqladmin-uroot-ppassword

       å›žè½¦å‡ºçŽ°

       Enterpassword:(注:这是叫你输入原密码.刚安装时密码为空,所以直接回车即可)

       æ­¤æ—¶mysql中账号root的密码被改为安装完毕

       é…ç½®php.ini并测试mysql

       æ‰¾åˆ°extension_dir=./改为extension_dir=e:/php/ext

       æ‰¾åˆ°

       ;extension=php_mysql.dll

       å°†';'去掉改为

       extension=php_mysql.dll

       æ‰¾åˆ°

       ;session.save_path=/tmp

       å°†';'去掉设置你保存session的目录,如

       session.save_path=e:/php/session_temp

       é‡å¯apache服务

       åœ¨Web根目录下建立testdb.php文件内容如下:

php

       $link=mysql_connect('localhost','root','');

       if(!$link)echofail;

       elseechosuccess;

       mysql_close();

       ç”¨æµè§ˆå™¨æ‰“开如果输出successå°±OK了

       phpmyadmin的安装配置

       å°†phpMyAdmin-V2.6.2-pl1.zip解压到WEB根目录中去,重命名文件夹为phpmyadmin或其它

       æ‰“å¼€phpmyadmin目录中的config.inc.php

       æ‰¾åˆ°

       $cfg['Servers'][$i]['user']='root';

       $cfg['Servers'][$i]['password']='';

       åˆ†åˆ«å¡«ä¸Šç”¨æˆ·åå’Œå¯†ç 

       linuxphp网站怎么安装

       ä¸€ã€å®‰è£…Apache2.2.

       1、到官网下载

       2、解压

       tar-zxvfpilerfoundin$Path

       ç›´æŽ¥è¿è¡Œyuminstallgcc,安装Gcc即可

       ç¬¬ä¸‰ä¸ªé—®é¢˜ä¸ºï¼špcre-configforlibpcrenotfound

       è§£å†³æ–¹æ³•å°±æ˜¯ä¸‹è½½prce安装包,和APR类似,安装到/usr/local/pcre文件夹下面即可。PS:fedora下安装c++编译器g++的命令为:yuminstallgcc-c++。

       5、编译

       make

       6、安装

       makeinstall

       7、启动,重启和停止,先切换到安装完成后的目录/usr/local/apache2/bin

       ./apachectl-kstart

       ./apachectl-krestart

       ./apachectl-kstop

       8、配置文件(满足最基本的配置)

       ç¼–辑/usr/local/apache2/conf/press.Z

       AddTypeapplication/x-gzip.gz.tgz

       åœ¨åŽé¢æ·»åŠ ï¼š

       AddTypeapplication/x-pression

        foreach (string file in filenames)

        {

        //打开压缩文件

        FileStream fs = File.OpenRead(file);

        byte[] buffer = new byte[fs.Length];

        fs.Read(buffer, 0, buffer.Length);

        ZipEntry entry = new ZipEntry(file);

        entry.DateTime = DateTime.Now;

        // set Size and the crc, because the information

        // about the size and crc should be stored in the header

        // if it is not set it is automatically written in the footer.

        // (in this case size == crc == -1 in the header)

        // Some ZIP programs have problems with zip files that don't store

        // the size and crc in the header.

        entry.Size = fs.Length;

        fs.Close();

        crc.Reset();

        crc.Update(buffer);

        entry.Crc = crc.Value;

        s.PutNextEntry(entry);

        s.Write(buffer, 0, buffer.Length);

        }

        s.Finish();

        s.Close();

        }

        }

       }

       现在再来看看解压文件类的源码

        /// <summary>

        /// 解压文件

        /// </summary>

       using System;

       using System.Text;

       using System.Collections;

       using System.IO;

       using System.Diagnostics;

       using System.Runtime.Serialization.Formatters.Binary;

       using System.Data;

       using ICSharpCode.SharpZipLib.BZip2;

       using ICSharpCode.SharpZipLib.Zip;

       using ICSharpCode.SharpZipLib.Zip.Compression;

       using ICSharpCode.SharpZipLib.Zip.Compression.Streams;

       using ICSharpCode.SharpZipLib.GZip;

       namespace DeCompression

       {

        public class UnZipClass

        {

        public void UnZip(string[] args)

        {

        ZipInputStream s = new ZipInputStream(File.OpenRead(args[0]));

        ZipEntry theEntry;

        while ((theEntry = s.GetNextEntry()) != null)

        {

        string directoryName = Path.GetDirectoryName(args[1]);

        string fileName = Path.GetFileName(theEntry.Name);

        //生成解压目录

        Directory.CreateDirectory(directoryName);

        if (fileName != String.Empty)

        {

        //解压文件到指定的目录

        FileStream streamWriter = File.Create(args[1]+theEntry.Name);

        int size = ;

        byte[] data = new byte[];

        while (true)

        {

        size = s.Read(data, 0, data.Length);

        if (size > 0)

        {

        streamWriter.Write(data, 0, size);

        }

        else

        {

        break;

        }

        }

        streamWriter.Close();

        }

        }

        s.Close();

        }

        }

       }

        有了压缩和解压缩的类以后,就要在窗体里调用了。怎么?是新手,不会调用?Ok,接着往下看如何在窗体里调用。

        首先在窗体里放置两个命令按钮(不要告诉我你不会放啊~),然后编写以下源码

       /// <summary>

        /// 调用源码

        /// </summary>

        private void button2_Click_1(object sender, System.EventArgs e)

        {

        string []FileProperties=new string[2];

        FileProperties[0]="C:\\unzipped\\";//待压缩文件目录

        FileProperties[1]="C:\\zip\\a.zip"; //压缩后的目标文件

        ZipClass Zc=new ZipClass();

        Zc.ZipFileMain(FileProperties);

        }

        private void button2_Click(object sender, System.EventArgs e)

        {

        string []FileProperties=new string[2];

        FileProperties[0]="C:\\zip\\test.zip";//待解压的文件

        FileProperties[1]="C:\\unzipped\\";//解压后放置的目标目录

        UnZipClass UnZc=new UnZipClass();

        UnZc.UnZip(FileProperties);

        }

        好了,到此为止,如何压缩和解压缩的类都已经完成了,需要的朋友直接拿走调吧。

关键词:传奇源码学习

copyright © 2016 powered by 皮皮网   sitemap