ASP如何实现远程文件操作?

ASP远程文件操作指南

ASP如何实现远程文件操作?

在现代网络应用中,文件的上传、下载和处理是常见的需求,本文将详细介绍如何利用ASP实现远程文件操作,包括远程文件下载和本地文件上传到服务器,通过具体的代码示例和详细的解释,读者能够掌握这些实用技能。

[一、]

[1. ASP技术简介]

ASP(Active Server Pages)是由微软公司开发的一种服务器端脚本环境,可以结合HTML、CSS、JavaScript等语言来创建动态网页,ASP具有强大的功能,特别是在文件处理方面表现突出。

[2. 远程文件操作的重要性]

在许多应用场景中,远程文件操作是不可或缺的一部分,从远程服务器获取数据文件进行本地分析,或将本地文件上传到远程服务器进行备份或共享。

[二、ASP远程文件下载]

[1. 使用XMLHTTP对象进行远程文件下载]

代码示例:

ASP如何实现远程文件操作?

<%
'函数名: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如何实现远程文件操作?

代码逻辑:上述代码首先检查本地文件的大小,然后通过循环多次请求文件的不同部分,直到文件全部下载完毕,每次请求后,都将下载的数据追加到本地文件中,如果在请求过程中出现错误,则会显示错误信息并退出。

[三、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 远程文件”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!