ASP如何实现远程文件操作?
ASP远程文件操作指南
在现代网络应用中,文件的上传、下载和处理是常见的需求,本文将详细介绍如何利用ASP实现远程文件操作,包括远程文件下载和本地文件上传到服务器,通过具体的代码示例和详细的解释,读者能够掌握这些实用技能。
[一、]
[1. ASP技术简介]
ASP(Active Server Pages)是由微软公司开发的一种服务器端脚本环境,可以结合HTML、CSS、JavaScript等语言来创建动态网页,ASP具有强大的功能,特别是在文件处理方面表现突出。
[2. 远程文件操作的重要性]
在许多应用场景中,远程文件操作是不可或缺的一部分,从远程服务器获取数据文件进行本地分析,或将本地文件上传到远程服务器进行备份或共享。
[二、ASP远程文件下载]
[1. 使用XMLHTTP对象进行远程文件下载]
代码示例:
<% '函数名:Download '作用:下载文件 '参数:URL-要获取的URL,savePath为文件保存地址 Public Function Download(ByVal URL, ByVal savePath) On Error Resume Next Dim ResBody, sStr, vPath, fileName, vErr vErr = True vPath = Replace(savePath, "/", "\") '替换路径分隔符 If Right(vPath, 1) <> "\" Then vPath = vPath & "\" sPos = InStrRev(URL, "/") + 1 sStr = Mid(URL, sPos) Set Http = Server.CreateObject("MICROSOFT.XMLHTTP") Http.Open "GET", URL, False Http.Send If Http.Readystate = 4 Then If Http.Status = 200 Then ResBody = Http.responseBody head = Http.getResponseHeader("content-disposition") If head <> "" Then startpos = InStr(head, "=") + 1 fileName = Mid(head, startpos) ElseIf InStr(sStr, ".") > 0 And InStr(sStr, "?") <= 0 Then fileName = sStr Else fileName = Getname() & ".dat" End If If WritFile(ResBody, vPath & fileName) Then vErr = False End If End If Download = Not vErr End Function '函数名:WritFile '作用:把指定二进制数据写入文件 '参数:byt--二进制数据,file--要写入的文件名 Public Function WritFile(ByVal byt, ByVal fileName) '写入文件函数 On Error Resume Next Dim objAso:Set objAso = Server.CreateObject("ADODB.Stream") objAso.Type = 1 objAso.Mode = 3 objAso.Open objAso.Position = 0 objAso.Write byt objAso.SaveToFile fileName, 2 objAso.Close Set objAso = Nothing WritFile = True End Function '函数名:Getname '作用:按日期获取随机数字 Public Function Getname() On Error Resume Next Dim y, m, d, h, mm, S, r Randomize y = Year(Now) m = Month(Now): If m < 10 Then m = "0" & m d = Day(Now): If d < 10 Then d = "0" & d h = Hour(Now): If h < 10 Then h = "0" & h mm = Minute(Now): If mm < 10 Then mm = "0" & mm S = Second(Now): If S < 10 Then S = "0" & S r = CInt(Rnd() * 1000) If r < 10 Then r = "00" & r If r < 100 And r >= 10 Then r = "0" & r Getname = y & m & d & h & mm & S & r End Function %> call download("http://chat.ii-home.cn/down/objupload.rar", server.mappath(".")) %>
解释:
WritFile函数:该函数用于将二进制数据写入指定的文件,它创建一个ADODB.Stream
对象,设置其类型为二进制并写入数据。
Download函数:该函数负责下载远程文件,它使用XMLHTTP
对象发送HTTP请求,获取响应后,根据内容头解析文件名,并调用WritFile
函数将文件保存到本地,如果无法获取文件名,则生成一个基于当前日期和时间的随机文件名。
Getname函数:该函数生成一个基于当前日期和时间的随机字符串,用于作为默认文件名。
[2. 断点续传下载]
代码示例:
Option Explicit Dim fso, aso, http, fo Dim strRemoteFileUrl, strLocalFile Dim nStartPos, nCurPos, Range, nTotalBytes, nPackage Dim Temp, i Set Fso = Server.CreateObject("Scripting.FileSystemObject") Set Aso = Server.CreateObject("ADODB.Stream") strRemoteFileUrl = "http://example.com/largefile.zip" strLocalFile = Server.MapPath("uploads/largefile.zip") nStartPos = 0 nCurPos = 0 Range = "" nTotalBytes = Fso.GetFile(strLocalFile).Size Do While nCurPos < nTotalBytes Set http = Server.CreateObject("Microsoft.XMLHTTP") http.open "GET", strRemoteFileUrl, False, "", "" If nStartPos > 0 Then Range = "bytes=" & nStartPos & "-" End If http.send Range & (nCurPos + 999999), "" If http.status = 206 Then 'Partial Content Aso.mode = 3 'Read/Write Aso.type = 1 'Binary Aso.open Aso.write http.responseBody nCurPos = nCurPos + Aso.size Aso.savetofile strLocalFile, 2 'Overwrite existing file Aso.close Set Aso = Nothing nStartPos = nCurPos + 1 ElseIf http.status = 200 Then 'OK first time only or completed in one part Aso.mode = 3 'Read/Write Aso.type = 1 'Binary Aso.open Aso.write http.responseBody Aso.savetofile strLocalFile, 2 'Overwrite existing file Aso.close Set Aso = Nothing Exit Do Else MsgBox "Error downloading file." & vbCrLf & "HTTP Status: " & http.status & vbCrLf & "Error: " & http.statusText, vbExclamation, "Error" Exit Sub End If Loop Set Fso = Nothing Set Aso = Nothing Set http = Nothing
解释:
断点续传原理:断点续传通过HTTP协议的Range头部字段来实现,只请求文件的某一部分而不是全部,客户端需要记录已下载的字节数,并在下一次请求时指定从哪个字节开始继续下载。
代码逻辑:上述代码首先检查本地文件的大小,然后通过循环多次请求文件的不同部分,直到文件全部下载完毕,每次请求后,都将下载的数据追加到本地文件中,如果在请求过程中出现错误,则会显示错误信息并退出。
[三、ASP本地文件上传到服务器]
[1. 使用Request.BinaryRead方法上传文件]
代码示例:
<%
'检查是否选择了文件
If Request.TotalBytes <> Request.Form + Request.File("upfile").Size Then
Response.Write "请选择文件!"
ElseIf Request.Form <> Then
Response.Write "请填写表单!"
ElseIf Request.File("upfile").Size > 0 Then
Dim formSize, formData, savePath, saveName, upExt, upPath, upFile, contentType, stream, iCountNum, iCountSize, iBlockSize, iRemainSize, iOutNum, iOutSize, iSmallBlock, iRunStart, iMaxSize, iMinSize, iBoundaryCnt, iBoundarySize, iBoundaryPos, iBoundaryStart, boundaryString, dataGB, dataMB, dataKB, dataByte, dataStream, dataLen, dataStart, dataEnd, dataTotal, dataChunk, dataBlock, dataRun, dataTemp '定义变量
iMinSize = 5 '最小值判断,单位:K
iMaxSize = 50 '最大值判断,单位:K
iCountSize = 0 '计数器大小,单位:K
iCountNum = 0 '计数器数量,无单位
iBlockSize = 204800 '每块大小,单位:Byte
iRemainSize = 0 '剩余大小,单位:Byte
iOutSize = 0 '输出大小,单位:Byte
iOutNum = 0 '输出数量,无单位
iSmallBlock = 0 '小块大小,单位:Byte
iRunStart = True '初始运行阶段,布尔型
savePath = Server.MapPath("upload") '保存路径
saveName = Replace(Request.Form("filename"), """", "") '文件名称,去除双引号
upExt = LCase(Mid(saveName, InStrRev(saveName, "."))) '扩展名,小写转换
upPath = savePath & "\" & saveName '保存完整路径
upFile = Request.TotalBytes Request.Form Request.File("upfile").Size '计算不需要读取的部分,单位:Byte
contentType = Request.ContentType '内容类型首部字段,单位:无
stream = Request.BinaryRead(iBlockSize) '读取二进制数据流,单位:Byte
iCountSize = iCountSize + 1 '计数器增加
Do While iCountSize < iMinSize And stream <> UpFile Or iCountNum < iMaxSize And stream <> UpFile '判断条件循环
iCountNum = iCountNum + 1 '计数器数量增加
If iRunStart = True Then '如果是初始运行阶段,执行以下语句
dataGB = Round((UpFile iOutSize) / 1024 / 1024 / 1024, 2) '计算剩余大小(GB),保留两位小数
dataMB = Round((UpFile iOutSize) / 1024 / 1024, 2) '计算剩余大小(MB),保留两位小数
dataKB = Round((UpFile iOutSize) / 1024, 2) '计算剩余大小(KB),保留两位小数
dataByte = UpFile iOutSize '计算剩余大小(Byte)
iRemainSize = iRemainSize + dataByte '更新剩余大小,单位:Byte
iSmallBlock = iBlockSize '小块大小初始化,单位:Byte
iRunStart = False '初始运行阶段结束,设置为False
Else '如果不是初始运行阶段,执行以下语句
dataGB = Round((iSmallBlock) / 1024 / 1024 / 1024, 2) '计算小块大小(GB),保留两位小数
dataMB = Round((iSmallBlock) / 1024 / 1024, 2) '计算小块大小(MB),保留两位小数
dataKB = Round((iSmallBlock) / 1024, 2) '计算小块大小(KB),保留两位小数
dataByte = iSmallBlock '计算小块大小(Byte)
iRemainSize = iRemainSize dataByte '更新剩余大小,单位:Byte
iSmallBlock = iSmallBlock2 '小块大小翻倍,单位Byte
iOutSize = iOutSize + iSmallBlock '输出大小增加,单位:Byte
iOutNum = iOutNum + 1 '输出数量增加,无单位
stream = Request.BinaryRead(iBlockSize) '读取二进制数据流,单位:Byte
iCountSize = iCountSize + 1 '计数器增加,单位:K
End If '结束If语句块
Loop '结束Do While循环块
Set stream = Nothing '释放stream对象引用,单位:无
Set contentType = Nothing '释放contentType对象引用,单位:无
upFile = upFile iRemainSize '更新不需要读取的部分,单位:Byte
dataStream = Request.BinaryRead(upFile) '读取剩余二进制数据流,单位:Byte
dataLen = LenB(dataStream) '获取二进制数据长度,单位:Byte
dataStart = InStr(1, dataStream, "--") '查找起始边界位置,单位:Byte
dataEnd = InStrRev(dataStream, "--") '查找结束边界位置,单位:Byte
dataTotal = dataEnd dataStart 2 '计算总数据长度(不包括起始和结束边界),单位:Byte
dataChunk = MidB(dataStream, dataStart, dataTotal) '提取中间数据块,单位:Byte
Set stream = CreateObject("ADODB.Stream") '创建新的ADODB流对象,单位:无
stream.Type = 1 '设置流类型为二进制,单位:无
stream.Open '打开流对象,单位:无
stream.Write dataChunk '写入数据块到流对象中,单位:无
stream.SaveToFile upPath, "binary" '将流对象保存为文件,单位:无
stream.Close '关闭流对象,单位:无
Set stream = Nothing '释放stream对象引用,单位:无
以上就是关于“asp 远程文件”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!