Использование .Net HttpWebRequest для публикации в FileUploadControl

Я пытаюсь опубликовать файл на простой странице с элементом управления загрузкой файлов. Я использовал код отсюда: HttpWebRequest FileUpload вызывает OutOfMemoryException с некоторыми настройками для публикации файла .

Public Function uploadFile(ByVal containa As CookieContainer, ByVal uri As String, ByVal filePath As String, ByVal fileParameterName As String, ByVal contentType As String, ByVal otherParameters As Specialized.NameValueCollection, Optional UserName As String = "", Optional Password As String = "") As String
    'https://stackoverflow.com/questions/4388689/vb-net-httpwebrequest-fileupload
    Dim boundary As String = "---------------------------" & DateTime.Now.Ticks.ToString("x")
    Dim newLine As String = System.Environment.NewLine
    Dim boundaryBytes As Byte() = System.Text.Encoding.ASCII.GetBytes(newLine & "--" & boundary & newLine)
    Dim request As Net.HttpWebRequest = Net.WebRequest.Create(uri)

    'Set credentials
    If UserName <> "" And Password <> "" Then
        Dim NetworkCred As New Net.NetworkCredential(UserName, Password)
        request.Credentials = NetworkCred
    End If

    request.ContentType = "multipart/form-data; boundary=" & boundary
    request.Method = "POST"
    request.CookieContainer = containa
    request.AllowAutoRedirect = True
    request.Timeout = -1
    request.KeepAlive = True
    request.AllowWriteStreamBuffering = True

    Dim ms As New MemoryStream()
    Dim formDataTemplate As String = "Content-Disposition: form-data; name=""{0}""{1}{1}{2}"

    For Each key As String In otherParameters.Keys
        ms.Write(boundaryBytes, 0, boundaryBytes.Length)
        Dim formItem As String = String.Format(formDataTemplate, key, newLine, otherParameters(key))
        Dim formItemBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(formItem)
        ms.Write(formItemBytes, 0, formItemBytes.Length)
    Next key

    ms.Write(boundaryBytes, 0, boundaryBytes.Length)

    Dim headerTemplate As String = "Content-Disposition: form-data; name=""{0}""; filename=""{1}""{2}Content-Type: {3}{2}{2}"
    Dim header As String = String.Format(headerTemplate, fileParameterName, filePath, newLine, contentType)
    Dim headerBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(header)
    ms.Write(headerBytes, 0, headerBytes.Length)

    Dim length As Long = ms.Length
    length += New FileInfo(filePath).Length
    request.ContentLength = length

    Using requestStream As IO.Stream = request.GetRequestStream()
        Dim bheader() As Byte = ms.ToArray()
        requestStream.Write(bheader, 0, bheader.Length)
        Using fileStream As New IO.FileStream(filePath, IO.FileMode.Open, IO.FileAccess.Read)

            Dim buffer(4096) As Byte
            Dim bytesRead As Int32 = fileStream.Read(buffer, 0, buffer.Length)

            Do While (bytesRead > 0)
                requestStream.Write(buffer, 0, bytesRead)
                bytesRead = fileStream.Read(buffer, 0, buffer.Length)
            Loop
        End Using
        requestStream.Close()
    End Using

    Dim response As Net.WebResponse = Nothing
    Dim responseText = ""

    Try

        response = request.GetResponse()

        Using responseStream As IO.Stream = response.GetResponseStream()

            Using responseReader As New IO.StreamReader(responseStream)

                responseText = responseReader.ReadToEnd()

            End Using

        End Using

    Catch exception As Net.WebException

        responseText = exception.Message

    Finally

        response.Close()
        response = Nothing
        request = Nothing
    End Try

    Return responseText

End Function

Для отладки процесса у меня есть простая форма загрузки UploadForm.aspx:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="UploadForm.aspx.vb" Inherits="UploadForm" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Upload Test Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Literal runat="server" ID="litInfo" EnableViewState="false"></asp:Literal><br />
<asp:FileUpload runat="server" ID="fuFile" />
<asp:LinkButton runat="server" ID="btnUpload" Text="Upload"></asp:LinkButton>
</div>
</form>
</body>
</html>

UploadForm.aspx.vb

Imports System.Reflection

Partial Class UploadForm
Inherits System.Web.UI.Page

Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    If fuFile.HasFile Then
        litInfo.Text &= "File Upload Control sees a file<br />"
    Else
        litInfo.Text &= "File Upload Control  does NOT see a file<br />"
    End If

    litInfo.Text &= "File Upload Count: " & Request.Files.Count & "<br />"
    If IsNothing(Request.InputStream) = False Then
        Using responseReader As New IO.StreamReader(Request.InputStream)
            litInfo.Text &= "<h3>Input Stream</h3>" & responseReader.ReadToEnd.Replace(vbCrLf, "<br />")
            responseReader.Close()
        End Using

    End If

    litInfo.Text &= "<h3>Request Properties</h3>" & ListProperties(Request).Replace(vbCrLf, "<br />")

    litInfo.Text &= "<h3>Headers</h3>"
    For Each Item As String In Request.Headers.Keys
        litInfo.Text &= Item & ": " & Request.Headers(Item) & "<br />"
    Next
End Sub

Function ListProperties(ByVal TheObject As Object) As String
    Dim property_value As Object
    Dim TypeInfo As Type = TheObject.GetType
    Dim properties_info As PropertyInfo() = TypeInfo.GetProperties()
    Dim ReturnBuilder As New System.Text.StringBuilder
    For i As Integer = 0 To properties_info.Length - 1
        With properties_info(i)
            If .GetIndexParameters().Length = 0 Then
                Try
                    property_value = .GetValue(TheObject, Nothing)
                    If property_value Is Nothing Then
                        ReturnBuilder.AppendLine(.Name & ": " & "Nothing")
                    Else
                        ReturnBuilder.AppendLine(.Name & ": " & property_value.ToString)
                    End If
                Catch ex As Exception
                    ReturnBuilder.AppendLine(.Name & ": Error")
                End Try

            Else
                ReturnBuilder.AppendLine(.Name & ": " & .PropertyType.ToString)
            End If
        End With
    Next i

    Return vbCrLf & ReturnBuilder.ToString
End Function
End Class

мой файл.csv

field1,field2,field3
1,2,3
4,5,6
7,8,9

Вызов выглядит так:

uploadFile(Ничего, "http://localhost:53239/TestSite/uploadform.aspx", "myfile.csv", "fuFile", "application/vnd.ms-excel", New NameValueCollection)

Он возвращает, что элемент управления загрузкой не видит файл, а входной поток видит. Я должен что-то упустить.

Я попытался загрузить страницу и проверил заголовки через FireBug, и опубликованные заголовки и данные выглядят одинаково.

Спасибо за любую помощь.


person senor_silly    schedule 23.03.2011    source источник
comment
Может быть, проблема с управлением asp и состоянием просмотра? Вы пробовали использовать обычный старый <input type="file" ..../>   -  person dotjoe    schedule 24.03.2011
comment
Пробовал обычный ввод, и он тоже не видит файл. Однако хорошее предложение.   -  person senor_silly    schedule 25.03.2011
comment
У кого-нибудь есть идеи?   -  person senor_silly    schedule 14.04.2011