桦山涧

桦山涧
Asp.net ---->知识改变命运!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
查找上传文件的时候记录下文件大小的方法 怀疑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