• 如何在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

  • 相关阅读:
    了解 Spring Data JPA
    Spring MVC 方法注解拦截器
    Spring MVC拦截器+注解方式实现防止表单重复提交
    java中return语句的用法总结
    equal方法在String类与Object类中的区别
    instanceof用法
    EL 简介及用法
    JAVA 四大域对象总结
    JSP基本语法
    Servlet请求转发 RequestDispatcher接口知识点
  • 原文地址:https://www.cnblogs.com/huashanlin/p/501483.html
Copyright © 2020-2023  润新知