zoukankan      html  css  js  c++  java
  • 如何在ASP.NET里用HtmlInputFile控件来上载文件。(编辑转)

    查找上传文件的时候记录下文件大小的方法 怀疑PostFileName.PostedFile.ContentLength 并不是文件的大小 而是长度 找了下面两个地方的佐证,也许是这样:
    一、

    ContentLength 属性
    .NET Framework 类库  

    FileWebRequest.ContentLength 属性

    获取或设置发送的数据的内容长度。

    [Visual Basic]
    Overrides Public Property ContentLength As Long
    [C#]
    public override long ContentLength {get; set;}
    [C++]
    public: __property __int64 get_ContentLength();
    public: __property void set_ContentLength(__int64);
    [JScript]
    public override function get ContentLength() : long;
    public override function set ContentLength(long);

    属性值

    发送的请求数据的字节数。

    异常

    异常类型 条件
    ArgumentException ContentLength 小于 0。

    示例

    [Visual Basic, C#, C++] 下面的示例设置正被发送数据的内容长度。请参考 FileWebRequest 类中的完整示例。

    [Visual Basic]
    ' Set the ContentLength property.
    myFileWebRequest.ContentLength = byteArray.Length
    Dim contentLength As String = myFileWebRequest.ContentLength.ToString()
    Console.WriteLine(ControlChars.Lf + "The content length is {0}.", contentLength)
    [C#]
    // Set the ContentLength property.
    myFileWebRequest.ContentLength=byteArray.Length;
    string contentLength = myFileWebRequest.ContentLength.ToString();
    Console.WriteLine("\nThe content length is {0}.", contentLength);
    [C++]
    // Set the ContentLength property.
    myFileWebRequest->ContentLength=byteArray->Length;
    String* contentLength = myFileWebRequest->ContentLength.ToString();
    Console::WriteLine(S"\nThe content length is {0}.", contentLength);
     
    二、
    
    
    Application Center Test  

    ContentLength 属性

    获取响应正文的大小(以字节为单位)。

    lBytes = Response.ContentLength

    返回值

    lBytes As Long:表示响应正文的大小(以字节为单位)。

    备注

    ContentLength 属性度量存储响应正文的缓冲区中所用的空间大小。

    如果为 Request.ResponseBufferSize 属性设置的值小于 HTTP 响应正文的大小,则 ContentLength 属性将等于 ResponseBufferSize 属性。它将小于响应正文的实际大小。

    请求较大的文件时,请确保缓冲区足以容纳响应正文。如果不需要访问正文并希望使用由 Web 服务器设置的 Content-Length HTTP 头,则可将 Request.ResponseBufferSize 属性设置为零以提高性能。

    注意,Response.BytesRecv 属性的值通常比 Response.ContentLength 和 Response.HeaderSize 两个属性值的总和大两个字节。BytesRecv 属性包括两个用于回车和分割消息头与正文的换行符的字节。

    '''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Procedure to calculate and log the size of the HTTP
    ' response message. Values determined from measuring the
    ' response data are compared to the value sent in the HTTP
    ' Content-Length header field.
    '
    Sub LogResponseSizeInfo(oResponse)
    Dim lMessageSize
    Dim strMessage
    If (oResponse Is Nothing) Then
    Call Test.Trace("Error: invalid request or host not found ")
    Else
    lMessageSize = oResponse.ContentLength + oResponse.HeaderSize
    strMessage = "Response message information --------" & vbCrLf
    strMessage = strMessage  & "Body size, from Content-Length: " & _
    CStr(oResponse.ContentLength) & vbCrLf
    strMessage = strMessage  & "Measured header size: " & _
    CStr(oResponse.HeaderSize) & vbCrLf
    strMessage = strMessage  & "Sum of content length and header size: " _
    & CStr(lMessageSize) & vbCrLf
    strMessage = strMessage  & "Measured bytes received: " & _
    CStr(oResponse.BytesRecv) & vbCrLf
    Call Test.Trace(strMessage)
    End If
    End Sub
    
    三、
    
    
    Application Center Test  

    ResponseBufferSize 属性

    获取或设置用于存储 Web 服务器响应的缓冲区大小。

    lBufferSize = Request.ResponseBufferSize [= lBufferSize]

    返回值

    lBufferSize As Long:表示存储服务器响应的缓冲区大小(以字节为单位)。默认值为 8192 字节。

    备注

    缓冲区表示用于存储响应正文的总内存量。如果响应正文的大小超过缓冲区的大小,ACT 将不存储剩余部分。Response.Body 属性仅返回缓冲区的内容,其中包含的响应消息正文可能不完整。

    将 ResponseBufferSize 值设置为 0 可以稍微改善性能,但无法访问响应正文的任何部分。在这种情况下,Response.Body 命令将返回空字符串。

    示例

    '''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Procedure to test the effect of using different
    ' response buffer sizes.
    '
    Sub TestBufferedTTLB
    Dim lCount, oConnection, oRequest, oResponse
    Dim strServer
    strServer = "localhost"
    Set oConnection = Test.CreateConnection(strServer)
    ' check for connection errors
    If (oConnection Is Nothing) Then
    Call Test.Trace("Error: Unable to create connection.")
    Else
    Set oRequest = Test.CreateRequest
    oRequest.Path = "/large.asp"
    For lCount = 0 to 2000 Step 500
    oRequest.ResponseBufferSize = lCount
    Set oResponse = oConnection.Send(oRequest)
    If (oResponse Is Nothing) Then
    Call Test.Trace("Error: invalid request or host not found ")
    Else
    Call Test.Trace("Buffer=" & CStr(lCount) & ", TTLB=" & CStr(oResponse.TTLB))
    End If
    Next
    Call oConnection.Close()
    End If
    End Sub
     
    四、一个使用该属性作为文件大小的例子
    
    

    (華版)

    以前要在ASP里上载文件真的要写一大堆程序。。。比如说把文件分段转换成Base64然后才上载到服务器,而在服务器那边由要从Base64转会原本的byte值才可以分段写如文件中。但是在ASP.NET里就完全只需用一行代码加一个HtmlInputFile控件就能做完这些复杂的程序。

    而要注意的就是紧记在包含HtmlInputFile控件的Form里多添加一个enctype的属性,enctype="multipart/form-data";然后再用HtmlInputFile控件里的PostedFile.SaveAs方法来上载文件就可以了。

     

    <form id="Form1" method="post" runat="server" enctype="multipart/form-data">
      
    </form>
            '声明变量
            Dim filename As String
            
    Dim data() As String

            
    Try
                
    '检查所选文件大小
                If PostFileName.PostedFile.ContentLength = 0 Then
                    
    '显示上载结果
                    Label3.Text = "上载失败!"
                Else
                    
    '显示所选文件资料
                    Label2.Text = "文件大小:" & PostFileName.PostedFile.ContentLength & " bytes<br>"
                    Label2.Text = Label2.Text & "文件类型:" & PostFileName.PostedFile.ContentType & "<br>"
                    Label2.Text = Label2.Text & "文件名称:" & PostFileName.PostedFile.FileName & "<br>"

                    '读取文件名称
                    data = Split(PostFileName.PostedFile.FileName, "\")
                    
    '上载文件到服务器
                    PostFileName.PostedFile.SaveAs(Server.MapPath("."& "\" & data(UBound(data)))

                    
    '显示上载结果
                    With Label3
                        .Text 
    = "上载成功!"
                        .ForeColor = Color.DarkGreen
                    
    End With
                
    End If
            
    Catch ex As Exception
                
    '显示错误讯息
                With Label3
                    .Text 
    = "Error: " & ex.Message
                    .ForeColor 
    = Color.Red
                
    End With
            
    End Try

    整体来说,最为麻烦的也不过是要从PostedFile.FileName里读取真整的文件名称(不包括括file path);不过这也大可用以下的简短代码来完成。

    '读取文件名称
    data = Split(PostFileName.PostedFile.FileName, "\")
    '文件名称
    Debug.Print data(UBound(data))

    如果要上载多个文件(为可更有效的重用代码),那可以用Request.File来读取每一个所选的文件名称;就如以下的代码。

            '声明变量
            Dim lIndex As Integer
            
    Dim lCount As Integer
            
    Dim hpf As HttpPostedFile
            
    Dim filename As String
            
    Dim data() As String

            
    Try
                
    '读取所有要上载文件的数目
                lCount = Request.Files.Count

                
    '读取每一个上载文件的资料
                For lIndex = 0 To lCount - 1
                    
    '读取第N个上载文件的资料
                    hpf = Request.Files(lIndex)

                    
    '检查所选文件大小
                    If hpf.ContentLength = 0 Then
                        
    '显示所选文件资料
                        Label2.Text = Label2.Text & "<br>" & "文件大小:" & hpf.ContentLength & " bytes<br>"
                        Label2.Text = Label2.Text & "文件类型:" & hpf.ContentType & "<br>"
                        Label2.Text = Label2.Text & "文件名称:" & hpf.FileName & "<br>"

                        '读取文件名称
                        data = Split(hpf.FileName, "\")
                        
    '上载文件到服务器
                        PostFileName.PostedFile.SaveAs(Server.MapPath("."& "\" & data(UBound(data)))

                        
    '显示上载结果
                        With Label3
                            .Text 
    = "上载成功!"
                            .ForeColor = Color.DarkGreen
                        
    End With
                    
    End If

                    
    '释放资源
                    hpf = Nothing
                
    Next
            
    Catch ex As Exception
                
    '显示错误讯息
                With Label3
                    .Text 
    = "Error: " & ex.Message
                    .ForeColor 
    = Color.Red
                
    End With
            
    End Try

  • 相关阅读:
    Atitit sql计划任务与查询优化器统计信息模块
    Atitit  数据库的事件机制触发器与定时任务attilax总结
    Atitit 图像处理知识点体系知识图谱 路线图attilax总结 v4 qcb.xlsx
    Atitit 图像处理 深刻理解梯度原理计算.v1 qc8
    Atiti 数据库系统原理 与数据库方面的书籍 attilax总结 v3 .docx
    Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析
    Atitit View事件分发机制
    Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结
    Atitti 存储引擎支持的国内点与特性attilax总结
    Atitit 深入理解软件的本质 attilax总结 软件三原则"三次原则"是DRY原则和YAGNI原则的折
  • 原文地址:https://www.cnblogs.com/huashanlin/p/501483.html
Copyright © 2011-2022 走看看