5、利用控件TVCLZip和TIdFTP压缩文件并上传到FTP的线程单元pas 改进版
用到临界区 保护写日志的函数;
递归函数 删除目录下的所有文件;
循环创建或判断FTP的目录;
可改进的地方:循环压缩深层次目录的所以文件; 实现断点续传,或断点下载;
- {*******************************************************************************
- Copyright (C), 2014-2020, aicaipiao
- File name: UFtpContentThd.pas
- Author: lipingchen
- Version:
- Date: 20140929
- Description:
- Others:
- Function List:
- 1.Date:2015.03.31
- Author: liping.chen
- Modification: 解压缩,FTP遍历创建新目录,上传
- *******************************************************************************}
- unit UFtpContentThd;
- interface
- uses
- Classes,Forms,Dialogs,SysUtils,Windows,VCLZip,VCLUnZip,IdFTP,IdFTPList,fClientDataModule,
- IdFTPListParseWindowsNT,IdAllFTPListParsers,DateUtils,SyncObjs;
- type
- TLogMsgProc = procedure (AMsg: string; const blnIsErrorMsg: boolean = False; const BoolSaveToFile: Boolean = True);
- TFtpContentThd = class(TThread)
- private
- FStart_Date,FEnd_Date,FNextDate :TDateTime;// 获取起始时间\获取结束时间\增加分钟 计算出结束时间
- FCount :Integer;
- FContent: wideString;
- protected
- ziper:TVCLZip;
- IdFTP: TIdFTP;
- FLogMsg: TLogMsgProc;
- Filename:string; //生成压缩文件名
- FMessage: string; //消息
- ZipUpLoadDir,ZipUpLoadDirTemp:string; //上传FTP的路径
- FDeptID:string; //出票点ID
- pub_Critical: TCriticalSection; //临界区
- //--------------
- procedure DoPostContent(var HasData: boolean);
- //定区间
- function Get_Bak_Date : Boolean; //获取时间段
- //取,存,压缩
- Function Get_ContentByDate(var HasData: boolean) : Boolean; // 根据推送的时间段,从票据打印表中取出数据获取,存为txt
- //上传
- Function UpLoad_Content_Zip :Boolean; //上传Zip包
- //更新
- Function Update_Content_Bak_Date : Boolean;
- public
- constructor Create(LogMsgProc: TLogMsgProc);
- procedure LogInfo(AMsg: string; const blnIsErrorMsg: boolean = False; const BoolSaveToFile: Boolean = True);
- destructor Destroy;override;
- function CreatFtpDir(UpLoadDir:string): Boolean; //遍历当前FTP文件夹, 创建新目录或更改路径
- function DeleteDirectory(NowPath: string): Boolean; // 循环删除整个目录下的所有文件包括文件夹
- function Zip(ZipMode,packSize:Integer;ZipFile,UnzipDir:string):Boolean;
- protected
- procedure Execute; override;
- end;
- var
- FtpContentThd:TFtpContentThd;
- implementation
- uses
- UPubTypeVarCon,UFrmMain,UPubFuncProc;
- { TFtpContentThd }
- constructor TFtpContentThd.Create(LogMsgProc: TLogMsgProc);
- var
- sFilePath:string;
- begin
- sFilePath:=ExtractFilePath(Application.ExeName);
- if sFilePath[Length(sFilePath)] <> '\' then sFilePath := sFilePath + '\';
- pub_UnZipFileSaveDir:=sFilePath+'PostContentRunLog\ConTxt';
- pub_ZipFileSaveDir:=sFilePath+ 'PostContentRunLog\ConZip';
- if not DirectoryExists(pub_UnZipFileSaveDir) then //未压缩的文件保存路径
- CreateDir(pub_UnZipFileSaveDir);
- if not DirectoryExists(pub_ZipFileSaveDir) then //压缩包保存路径
- CreateDir(pub_ZipFileSaveDir);
- DeleteDirectory(pub_UnZipFileSaveDir); //每次打开先删除这两个目录下的所有文件
- DeleteDirectory(pub_ZipFileSaveDir);
- //此处要删除 上一次的txt和zip; 若改进为断点续传,可变更逻辑
- try
- inherited Create(True);
- FreeOnTerminate := True;
- FLogMsg:=LogMsgProc;
- //FDeptID:='6';
- pub_Critical := TCriticalSection.create;
- ziper:=TVCLZip.Create(nil);
- IdFTP:=TIdFTP.Create;
- LogInfo('创建FTP上传线程成功!',true,true);
- Resume;
- except
- on e:exception do
- begin
- FMessage:='创建FTP上传线程出错!'#+e.Message;
- LogInfo(FMessage,true,true);
- end;
- end;
- end;
- procedure TFtpContentThd.Execute;
- var
- HasData: boolean;
- begin
- while not Terminated do
- begin
- DoPostContent(HasData);
- if HasData then
- Sleep()
- else
- Sleep(pub_FtpExecInterval * ); //等待中
- end;
- end;
- {Zip用法:Zip(压缩模式,压缩包大小,压缩或解压文件,解压或压缩目录,TVCLZip控件)
- ZipMode为0:压缩;为1:解压缩 PackSize为0则不分包;否则为分包的大小 }
- function TFtpContentThd.Zip(ZipMode, packSize: Integer; ZipFile,
- UnzipDir: string): Boolean;
- begin
- if copy(UnzipDir,length(UnzipDir),)='\'then
- UnzipDir:=copy(UnzipDir,,length(UnzipDir)-);//去除目录后的'\'
- try
- ziper.DoAll:=False; //加此设置将对分包文件解压缩无效
- ziper.OverwriteMode:=Always; //总是覆盖模式
- if PackSize<>0then //0则压缩成一个文件,否则压成多文件
- begin
- ziper.MultiZipInfo.MultiMode:=mmBlocks; //设置分包模式
- ziper.MultiZipInfo.SaveZipInfoOnFirstDisk:=True;//打包信息保存在第一文件中
- ziper.MultiZipInfo.FirstBlockSize:=PackSize; //分包首文件大小
- ziper.MultiZipInfo.BlockSize:=PackSize; //其他分包文件大小
- end;
- ziper.FilesList.Clear;
- ziper.ZipName:=ZipFile; //获取压缩文件名
- if ZipMode=0then //压缩
- begin
- ziper.FilesList.Add(UnzipDir+'\*.txt'); //添加压缩文件列表 设定为|*.txt文档,若需压缩全部可\*.*
- //ziper.
- Application.ProcessMessages;
- ziper.Zip;
- end else
- begin
- ziper.DestDir:=UnzipDir; //解压缩的目标目录
- ziper.UnZip; //解压缩
- end;
- Result:=True;
- except
- on ex:exception do
- begin
- Result:=False;
- FMessage := '文件解压缩异常'# + ex.Message;
- LogInfo(FMessage,True,True);
- end;
- end;
- end;
- {遍历当前FTP文件夹, 创建新目录或更改路径}
- function TFtpContentThd.CreatFtpDir(UpLoadDir: string): Boolean;
- var
- CreatDirList: TStringList;
- i,j,flag:Integer;
- begin
- CreatDirList:=TStringList.Create;
- CreatDirList.Delimiter :='\';
- CreatDirList.DelimitedText :=UpLoadDir;
- for i := to CreatDirList.Count - do
- begin
- if CreatDirList[i]<>'' then
- begin
- flag:=;
- IdFTP.List;
- //ShowMessage(IntToStr(IdFTP.DirectoryListing.Count)); //默认uses idftplistParse异常;要添加IdFTPListParseWindowsNT,IdAllFTPListParsers单元
- for j := to IdFTP.DirectoryListing.Count- do //indy10要添加IdFTPListParseWindowsNT,IdAllFTPListParsers单元
- begin //介绍:http://blog.sunshow.net/2007/07/tidftp-directorylisting-usage/
- if IdFTP.DirectoryListing.Items[j].ItemType = ditDirectory then //要添加单元IdFTPList
- begin
- if IdFTP.DirectoryListing.Items[j].FileName = CreatDirList[i] then
- begin
- flag:=; //标志已经存在该目录
- Break;
- end;
- end;
- end;
- if flag= then
- IdFTP.MakeDir(CreatDirList[i]); //新创建文件夹
- IdFTP.ChangeDir(CreatDirList[i]); //更改目录
- end;
- //***以下DirList内容有空格,IndexOf(CreatDirList[i])识别不了;也不严谨***
- { if CreatDirList[i]<>'' then
- begin
- IdFTP.List(DirList,'',True);
- if (DirList.IndexOf(CreatDirList[i])=-1) then
- begin
- try
- IdFTP.MakeDir(CreatDirList[i]);
- except on ex:Exception do
- LogInfo('添加目录名:'+CreatDirList[i]+'出错,原因:'+ex.Message,True,True );
- end;
- try
- IdFTP.ChangeDir(CreatDirList[i]);
- except on ex:Exception do
- LogInfo('变更目录名:'+CreatDirList[i]+'出错,原因:'+ex.Message,True,True );
- end;
- end;
- end; }
- //***以下忽略异常,懒虫写法,***
- { try
- IdFTP.ChangeDir(CreatDirList[i]);
- except
- IdFTP.MakeDir(CreatDirList[i]);
- IdFTP.ChangeDir(CreatDirList[i]);
- end;}
- //***以下忽略异常,懒虫写法,***
- { try
- IdFTP.MakeDir(CreatDirList[i]);
- finally
- IdFTP.ChangeDir(CreatDirList[i]);
- end; }
- end;
- CreatDirList.Free;
- Result :=True;
- end;
- destructor TFtpContentThd.Destroy;
- begin
- //inherited; //继承会产生异常 为什么??
- ziper.Free;
- IdFTP.Free;
- pub_Critical.Free;
- try
- LogInfo('FTP上传线程终止',False,true);
- FtpContentThd.Terminate;
- WaitForSingleObject(FtpContentThd.Handle, );
- FtpContentThd := nil;
- except on ex:Exception do
- begin
- end;
- end;
- end;
- function TFtpContentThd.Get_Bak_Date: Boolean;
- var
- sql1 :string;
- count :integer;
- Now_Date :TDateTime;
- begin
- Result := True;
- Now_Date := StrToDateTime(FormatDateTime('YYYY/MM/DD hh:mm:ss',Now()));
- //获取时间段内的票面内容
- Sql1 := 'SELECT * FROM TICKET_CONTENT_BAK_DATE WHERE STATUS = 0';
- try
- try
- with ClientDataModule.orqry1 do
- begin
- SQL.Clear;
- SQL.Text := sql1;
- Open;
- First;
- count := RecordCount;
- if Count = then
- begin
- //临时增加一条数据,否则程序无法进行
- FMessage := '上传票面内容时,未找到相应上传区间。';
- LogInfo(FMessage,True);
- Result := False;
- Exit;
- end;
- // 获取相关信息
- FStart_Date := FieldByName('START_DATE').AsDateTime; // 获取起始时间
- FEnd_Date := fieldByName('END_DATE').AsDateTime; // 获取结束时间
- FNextDate := IncSecond(FEnd_Date,Pub_SecondInterval);
- Close;
- end;
- Now_Date := IncMinute(Now_Date,-Pub_Before_Minitue); //只取Now()前5分钟的数据;
- If FNextDate > Now_Date then
- begin
- Result := False;
- end;
- except on Ex:Exception do
- begin
- FMessage := '查找相应上传区间时,服务器断开或异常。';
- LogInfo(FMessage,True);
- Result := False;
- end;
- end;
- finally
- end;
- end;
- function TFtpContentThd.Get_ContentByDate(var HasData: boolean): Boolean;
- var
- sql1,s :string;
- s_TID,s_CheckNo :string;
- s_content,s_content_left,s_content_right :widestring;
- Msg :string;
- i : Integer;
- begin
- Result := True;
- Msg := '查找票面内容,如下区间:';
- Msg := Msg + Formatdatetime('YYYY-MM-DD hh:mm:ss',FStart_Date);
- Msg := Msg + ' -- ';
- Msg := Msg + Formatdatetime('YYYY-MM-DD hh:mm:ss',FEnd_Date);
- LogInfo(Msg);
- // 根据推送的时间段,从票据打印表中取出数据
- Sql1 := ' SELECT A.TID,A.CHECK_NO,B.CONTENT FROM TICKET_PRINT_HISTORY A,TICKET_CONTENT B ' +
- ' WHERE A.TID=B.TID ' +
- ' AND A.PRINT_TIME >= TO_DATE(' + Quotedstr(DateTimeToStr(FStart_Date)) + ',' + Quotedstr('yyyy-mm-dd hh24:mi:ss') + ')' +
- ' AND A.PRINT_TIME < TO_DATE(' + Quotedstr(DateTimeToStr(FEnd_Date)) + ',' + Quotedstr('yyyy-mm-dd hh24:mi:ss') + ')';
- //测试语句
- //sql1 := 'SELECT TID,CHECK_NO FROM TICKET_PRINT_HISTORY WHERE TID >= 39332133 AND TID<=39334764';
- try
- try
- with ClientDataModule.orqry1 do
- begin
- try
- sql.Clear;
- SQL.Text := sql1;
- Open;
- First;
- FCount := RecordCount;
- if FCount > then
- begin
- HasData := True;
- LogInfo('开始解析票面内容。总数为: ' + IntToStr(FCount) + '条。');
- end
- else
- begin
- HasData := False;
- FMessage := '查找区间票面内容为空。';
- LogInfo(FMessage);
- Result := True;
- Exit;
- end;
- while not Eof do
- begin
- Try
- s_TID := FieldByName('TID').asstring;
- LogInfo('解析票面内容。票ID为:' + s_TID,False,True); //不需要写日志吧
- FContent := Trim(FieldByName('CONTENT').Asstring);
- //FContent := Trim(FieldByName('CHECK_NO').Asstring); //ss测试语句
- pub_Critical.Enter;
- try
- WriteLog(pub_UnZipFileSaveDir+'\' +s_TID+ '.Txt',FContent,True); //若存在该文件,覆盖模式
- finally
- pub_Critical.Leave;
- end;
- Next;
- except on Ex:Exception do
- begin
- FMessage := '解析单张票面内容时,出现异常。' + Ex.Message;
- LogInfo(FMessage,True);
- Result := False;
- Exit;
- end;
- end;
- end;
- Close;
- Except on Ex:Exception do
- begin
- Close;
- FMessage := '查找区间内票面内容时,服务器断开或异常。' + Ex.Message;
- LogInfo(FMessage,True);
- //获取数据时出现异常
- Result := False;
- end;
- end;
- end;
- Except on Ex:Exception do
- begin
- FMessage := '查找区间内票面内容时,服务器断开或异常。' + Ex.Message;
- LogInfo(FMessage,True);
- //获取数据时出现异常
- Result := False;
- end;
- end;
- finally
- end;
- end;
- procedure TFtpContentThd.DoPostContent(var HasData: boolean);
- begin
- HasData := False;
- try
- //1、从数据库取得指定区间的数据,保存为多个txt,
- //2、当前文件夹的*.txt全部保存为zip
- //3、ftp上传到服务器
- LogInfo('开始取区间');
- if not Get_Bak_Date then Exit;
- LogInfo('开始取区间内票面内容');
- //ss -------测试
- //FStart_Date:=Now();
- //FEnd_Date:=Now();
- if not Get_ContentByDate(HasData) then Exit;
- DateTimeToString(Filename,'YYYYMMDD-HHMMSS',FStart_Date); //压缩包名称,以区间开始时间命名
- Filename:=Filename+'.zip';
- LogInfo('执行压缩');
- if not Zip(,,pub_ZipFileSaveDir+'\'+Filename,pub_UnZipFileSaveDir) then //将abc.zip解压到路径,若不存在会自动创建目录的。
- begin //压缩时,若路径不存在,是否会创建;
- exit;
- end;
- LogInfo('提交票面内容压缩包到文件服务器');
- DateTimeToString(ZipUpLoadDir,'YYYY\MM\DD\HH',Now); //压缩包上传路径
- if not UpLoad_Content_Zip then Exit;
- LogInfo('更新提交状态');
- if not Update_Content_Bak_Date then Exit;
- LogInfo('执行下一批数据');
- finally
- end;
- end;
- function TFtpContentThd.UpLoad_Content_Zip: Boolean;
- begin
- //发送
- Result:=False;
- with IdFTP do
- begin
- if not Connected then
- begin
- Username:=pub_FtpUsername;
- Password:=pub_FtpPassword;
- try
- Connect(pub_FtpHost,pub_FtpPort);
- except
- on e:exception do
- begin
- FMessage:='连接FTP服务器出错!'#+e.Message;
- LogInfo(FMessage,true,true);
- Exit;
- end;
- end;
- end;
- if Connected then
- begin
- if ZipUpLoadDirTemp<>ZipUpLoadDir then //上传保存的路径改变,则创建新目录或更改路径。
- begin
- ChangeDir(pub_ZipUpLoadRtDir); //先回到设定的根目录
- CreatFtpDir(ZipUpLoadDir); //遍历当前FTP文件夹, 创建新目录或更改路径
- end;
- try
- Put(pub_ZipFileSaveDir+'\'+Filename,Filename);
- deletefile(PChar(pub_ZipFileSaveDir+'\'+Filename)); //删除已上传的文件
- DeleteDirectory(pub_UnZipFileSaveDir); //删除已经上传的文件夹的所有txt
- except
- on e:exception do
- begin
- FMessage:='文件上传FTP服务器出错!'#+e.Message;
- LogInfo(FMessage,true,true);
- Exit;
- end;
- end;
- end;
- end;
- ZipUpLoadDirTemp:=ZipUpLoadDir;
- Result:=True;
- end;
- function TFtpContentThd.Update_Content_Bak_Date: Boolean;
- var
- sql1,sql2 : string;
- begin
- Result := True;
- try
- // 如果上面对数据进行处理出现异常时,则退出本次上传
- // 全部数据上传成功,则进行状态重置
- Sql1 := 'BEGIN UPDATE TICKET_CONTENT_BAK_DATE SET STATUS=1,POST_DATE=SYSDATE, ' +
- ' POST_COUNT=' + Quotedstr(IntTostr(FCount)) +
- ' WHERE STATUS = 0;';
- // 插入下一条上传时间段
- sql2 := ' INSERT INTO TICKET_CONTENT_BAK_DATE (ID,START_DATE,END_DATE,POST_COUNT,POST_DATE,STATUS) ' +
- ' VALUES(SEQ_CONTENT_BAK_DATE.Nextval,TO_DATE('+ Quotedstr(Formatdatetime('YYYY-MM-DD hh:mm:ss',FEnd_Date)) +
- ',' + QuotedStr('yyyy-mm-dd hh24:mi:ss') + '),TO_DATE(' + Quotedstr(Formatdatetime('YYYY-MM-DD hh:mm:ss',FNextDate)) +
- ',' + QuotedStr('yyyy-mm-dd hh24:mi:ss') + '),0,SYSDATE,0);' +
- ' COMMIT; END;' ;
- ClientDataModule.orqry1.SQL.Clear;
- ClientDataModule.orqry1.SQL.Text := sql1 + sql2;
- ClientDataModule.orqry1.Execute;
- ClientDataModule.orqry1.Close;
- //
- //LogInfo('建立下一次上传区间');
- except on ex:exception do
- begin
- FMessage := '更新上传状态时,服务器断开或异常。' + Ex.Message;
- LogInfo(FMessage,True);
- Result := False;
- end;
- end;
- end;
- {循环删除整个目录下的所有文件包括文件夹}
- function TFtpContentThd.DeleteDirectory(NowPath: string): Boolean;
- var
- search: TSearchRec;
- ret: integer;
- key: string;
- begin
- Result:=False;
- if NowPath[Length(NowPath)] <> '\' then
- NowPath := NowPath + '\';
- key := NowPath + '*.*';
- ret := findFirst(key, faanyfile, search);
- while ret = do
- begin
- if ((search.Attr and fadirectory) = fadirectory) then
- begin
- if (search.Name <> '.') and (search.name <> '..') then
- begin
- DeleteDirectory(NowPath + search.name);
- removedir(NowPath + search.name); //如果需要删除文件夹则添加
- end;
- end
- else
- begin
- if ((search.Attr and fadirectory) <> fadirectory) then
- begin
- deletefile(PAnsiChar(NowPath + search.name));
- end;
- end;
- ret := FindNext(search);
- end;
- SysUtils.FindClose(search);
- //FindClose(search.FindHandle);
- //FindClose(search); //发现在线程里面不能用这,只能用上面的句柄
- //removedir(NowPath); //如果需要删除最外层文件夹则添加
- result := True;
- end;
- procedure TFtpContentThd.LogInfo(AMsg: string; const blnIsErrorMsg,
- BoolSaveToFile: Boolean);
- begin
- pub_Critical.Enter;
- try
- FLogMsg(AMsg,blnIsErrorMsg,BoolSaveToFile);
- finally
- pub_Critical.Leave;
- end;
- end;
- initialization
- //
- finalization
- //
- end.
代码
- procedure TFrmFTP_ZIP.btnBreUpLoadClick(Sender: TObject);
- var
- tStream: TFileStream;
- Size1:Integer;
- begin
- if IdFTP1.Connected then
- begin
- if not UploadOpenDialog1.Execute then
- Exit;
- tStream:=TFileStream.Create(UploadOpenDialog1.FileName,fmOpenRead );
- try
- Size1 :=IdFTP1.Size(ExtractFileName(UploadOpenDialog1.FileName));
- if Size1 > then //这样判断文件是否存在 是错误的。
- begin
- case MessageDlg('文件已经存在,是否续传?', mtConfirmation, mbYesNoCancel, ) of
- mrYes:
- begin
- tStream.Position:=Size1;
- //tStream.Seek(IdFTP1.Size('Delphi大量pdf资料非扫描档1.zip'),0) ; //也可以。
- IdFTP1.Put(tStream,ExtractFileName(UploadOpenDialog1.FileName),true); //续传
- end;
- mrNo:
- begin
- IdFTP1.Put(tStream,ExtractFileName(UploadOpenDialog1.FileName),False); //重新传
- end;
- mrCancel: Exit; //取消
- end;
- end
- else
- IdFTP1.Put(tStream,ExtractFileName(UploadOpenDialog1.FileName),False);
- { tStream.Position:=IdFTP1.Size('Delphi大量pdf资料非扫描档1.zip'); //当前路径的指定文件
- //tStream.Seek(IdFTP1.Size('Delphi大量pdf资料非扫描档1.zip'),0) ; //也可以。
- IdFTP1.Put(tStream,'Delphi大量pdf资料非扫描档1.zip',true); }
- finally
- tStream.Free;
- end;
- end
- else
- ShowMessage('Ftp未连接');
- end;
- procedure TFrmFTP_ZIP.btnBreDownLoadClick(Sender: TObject);
- begin
- if IdFTP1.Connected then
- begin
- if FileExists('Delphi大量pdf资料非扫描档1.zip') then
- begin
- case MessageDlg('文件已经存在,是否续传?', mtConfirmation, mbYesNoCancel, ) of
- mrYes: FtpDownLoad( 'Delphi大量pdf资料非扫描档1.zip', True); //续传
- mrNo: FtpDownLoad( 'Delphi大量pdf资料非扫描档1.zip', False); //覆盖
- mrCancel: Exit; //取消
- end;
- end
- else
- FtpDownLoad( 'Delphi大量pdf资料非扫描档1.zip', False); //建立新文件下载
- end
- else
- ShowMessage('Ftp未连接');
- end;
断点上传和断点下载代码
5、利用控件TVCLZip和TIdFTP压缩文件并上传到FTP的线程单元pas 改进版的更多相关文章
- WPF中利用控件的DataContext属性为多个TextBox绑定数据
工作上需要从给定的接口获取数据,然后显示在界面的编辑框中,以往肯定会一个一个的去赋值,但这样太麻烦而且效率很低,不利于维护,于是想到了数据绑定这一方法,数据绑定主要利用INotifyPropertyC ...
- 百度 flash html5自切换 多文件异步上传控件webuploader基本用法
双核浏览器下在chrome内核中使用uploadify总有302问题,也不知道如何修复,之所以喜欢360浏览器是因为帮客户控制渲染内核: 若页面需默认用极速核,增加标签:<meta name=& ...
- WebBrowser控件应用:播放PPT文件
原文:WebBrowser控件应用:播放PPT文件 一开始想的是用webform来做,用iframe加载文件,把ppt文件另存成htm,然后播放. 可是后来发现,的程序不大容易控制,所以改用winfo ...
- 使用NeatUpload控件实现ASP.NET大文件上传
使用NeatUpload控件实现ASP.NET大文件上传 一般10M以下的文件上传通过设置Web.Config,再用VS自带的FileUpload控件就可以了,但是如果要上传100M甚至1G的文件就不 ...
- Delphi/XE2 使用TIdHttp控件下载Https协议服务器文件[转]
之前的一篇博文详细描述了使用TIdhttp控件下载http协议的文件,在我项目的使用过程中发现对于下载Https协议中的文件与Http协议的文件不同,毕竟Https在HTTP协议基础上增加了SSL协议 ...
- 如何利用Grunt生成对应的Source Map文件,线上代码压缩使用chrome浏览器便于调式
如何利用Grunt生成对应的Source Map文件,线上代码压缩使用chrome浏览器便于调式 首先我们来说说为何要生成sourceMap文件呢?简单的说,sourceMap是为了压缩后的代码调式提 ...
- Web大文件(夹)上传(断点续传)控件-Xproer.HttpUploader6
版权所有 2009-2017荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...
- jquery文件批量上传控件Uploadify3.2(java springMVC)
人比較懒 有用为主 不怎么排版了 先放上Uploadify的官网链接:http://www.uploadify.com/ -->里面能够看到PHP的演示样例,属性说明,以及控件下载地址.分f ...
- 文件夹上传控件webupload插件
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...
随机推荐
- python安装paramiko模块
一.简介 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 由于使用的是python这样的能够跨平台运行的语言,所以所有python支 ...
- IPv6地址介绍
IPv6地址介绍 2008 年 04 月 10 日 1. 认识IPv6地址 IPv4地址是类似 A.B.C.D 的格式,它是32位,用\".\"分成四段,用10进制表示:而IPv6 ...
- Makefile_:=与=的区别
1."=" make会将整个makefile展开后,再决定变量的值.也就是说,变量的值将会是整个makefile中最后被指定的值.看例子: x = foo y ...
- TCP/IP五层模型
(2)TCP/IP五层模型的协议 应用层 传输层 网络层 数据链路层 物理层 物理层:中继器.集线器.还有我们通常说的双绞线也工作在物理层 数据链路层:网桥(现已很少使用).以太网交换机(二层 ...
- NYOJ题目766回文数
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsgAAAHaCAIAAACSPygsAAAgAElEQVR4nO3dO3LqSheG4X8S5AyEWB ...
- KMP算法学习
kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O中出现,如果出现则返回出现的位置.常规方法是遍历a的每一个位置,然后从该位置开始和b进行匹配,但是这种方法的复杂度是O(n ...
- 《linux系统及其编程》实验课记录(六)
实验 6:Linux 文件系统 实验环境: 安装了 Red Hat Enterprise Linux 6.0 可运行系统,并且是成功验证系统.有另外一个无特权用户 student,密码 student ...
- js判断访问的当前设备是手机还是电脑
function browserRedirect() { var sUserAgent = navigator.userAgent.toLowerCase(); var bIsIpad = sUser ...
- h264 profile & level
转自:http://blog.csdn.net/sphone89/article/details/17492433 H.264 Profiles H.264有四种profile,每个profile支持 ...
- leetcode1237
date: 2015-09-09 20:20:58 Two Sum Given an array of integers, find two numbers such that they add up ...