C# vb.net将图像文件发布到php返回0

C# vb.net将图像文件发布到php返回0,c#,php,vb.net,C#,Php,Vb.net,这是制作该帖子的功能 Public Function sendHttpRequest(url As String, values As NameValueCollection, Optional files As NameValueCollection = Nothing) As String Dim boundary As String = "----------------------------" + DateTime.Now.Ticks.ToString("x") Di

这是制作该帖子的功能

Public Function sendHttpRequest(url As String, values As NameValueCollection, Optional files As NameValueCollection = Nothing) As String
    Dim boundary As String = "----------------------------" + DateTime.Now.Ticks.ToString("x")

    Dim boundaryBytes As Byte() = System.Text.Encoding.UTF8.GetBytes((Convert.ToString(vbCr & vbLf & "--") & boundary) + vbCr & vbLf)

    Dim trailer As Byte() = System.Text.Encoding.UTF8.GetBytes((Convert.ToString(vbCr & vbLf & "--") & boundary) + "--" & vbCr & vbLf)

    Dim boundaryBytesF As Byte() = System.Text.Encoding.ASCII.GetBytes((Convert.ToString("--") & boundary) + vbCr & vbLf)

    Dim request As HttpWebRequest = DirectCast(WebRequest.Create(url), HttpWebRequest)
    request.ContentType = Convert.ToString("multipart/form-data; boundary=") & boundary
    request.Method = "POST"
    request.KeepAlive = True
    request.Credentials = System.Net.CredentialCache.DefaultCredentials

    Dim requestStream As Stream = request.GetRequestStream()

    For Each key As String In values.Keys

        Dim cntDisp = "Content-Disposition: form-data; name=""{0}"";" & vbCr & vbLf & vbCr & vbLf & "{1}"
        Dim formItemBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(String.Format(cntDisp, key, values(key)))
        requestStream.Write(boundaryBytes, 0, boundaryBytes.Length)
        requestStream.Write(formItemBytes, 0, formItemBytes.Length)
    Next

    If files IsNot Nothing Then
        For Each key As String In files.Keys
            If File.Exists(files(key)) Then
                Dim bytesRead As Integer = 0
                Dim buffer As Byte() = New Byte(2047) {}
                Dim cnt As String = "Content-Disposition: form-data; name=""{0}""; filename=""{1}""" & vbCr & vbLf
                Dim cntype As String = "Content-Type: application/octet-stream" & vbCr & vbLf & vbCr & vbLf
                Dim formItemBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(String.Format(cnt & cntype, key, files(key)))
                requestStream.Write(boundaryBytes, 0, boundaryBytes.Length)
                requestStream.Write(formItemBytes, 0, formItemBytes.Length)

                Using fileStream As New FileStream(files(key), FileMode.Open, FileAccess.Read)
                    While (bytesRead = fileStream.Read(buffer, 0, buffer.Length)) <> 0

                        requestStream.Write(buffer, 0, bytesRead)
                    End While

                    fileStream.Close()
                End Using
            End If
        Next
    End If


    requestStream.Write(trailer, 0, trailer.Length)
    requestStream.Close()

    Dim reader As New StreamReader(request.GetResponse().GetResponseStream())


    res = reader.ReadToEnd()

    Return res

End Function
在我的php文件中,我得到了一个简单的var_转储($\u POST)和var_转储($\u文件)


这篇文章写得很好,收到了数据,图像大小始终为0。我尝试更改内容类型,但结果相同,所以我被困在这里,你能给我一些建议吗,谢谢。

经过几天的错误和研究,我终于找到了答案(在我发表这篇文章之前,不仅仅是给人一个负面的印象,请记住…像我这样的人只是想学习并获得一些高级帮助)这是更新的代码,用VB编写一篇文章,使用实际调用,我相信它会帮助其他人

Imports System.Collections.Specialized
Imports System.IO
Imports System.Net

Public Class DataUpload
Dim res As String
Public Function sendHttpRequest(url As String, values As 
NameValueCollection, Optional files As NameValueCollection = Nothing) As 
String
    Dim boundary As String = "----------------------------" + 
  DateTime.Now.Ticks.ToString("x")
    Dim boundaryBytes As Byte() = System.Text.Encoding.UTF8.GetBytes((Convert.ToString(vbCr & vbLf & "--") & boundary) + vbCr & vbLf)
    Dim trailer As Byte() = System.Text.Encoding.UTF8.GetBytes((Convert.ToString(vbCr & vbLf & "--") & boundary) + "--" & vbCr & vbLf)
    Dim boundaryBytesF As Byte() = System.Text.Encoding.ASCII.GetBytes((Convert.ToString("--") & boundary) + vbCr & vbLf)
    Dim request As HttpWebRequest = DirectCast(WebRequest.Create(url), HttpWebRequest)
    request.ContentType = Convert.ToString("multipart/form-data; boundary=") & boundary
    request.Method = "POST"
    request.KeepAlive = True
    request.Credentials = System.Net.CredentialCache.DefaultCredentials
    Dim requestStream As Stream = request.GetRequestStream()

    For Each key As String In values.Keys
        Dim cntDisp = "Content-Disposition: form-data; name=""{0}"";" & vbCr & vbLf & vbCr & vbLf & "{1}"
        Dim formItemBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(String.Format(cntDisp, key, values(key)))
        requestStream.Write(boundaryBytes, 0, boundaryBytes.Length)
        requestStream.Write(formItemBytes, 0, formItemBytes.Length)
    Next
    Dim count = 0
    If files IsNot Nothing Then

        For Each key As String In files.Keys
            If File.Exists(files(key)) Then
                Dim bytesRead As Integer = 0
                Dim buffer As Byte() = New Byte(2048) {}
                Dim cnt As String = "Content-Disposition: form-data; name=""{0}""; filename=""{1}""" & vbCr & vbLf
                Dim cntype As String = "Content-Type: application/octet-stream" & vbCr & vbLf & vbCr & vbLf
                Dim formItemBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(String.Format(cnt & cntype, key, files(key)))
                requestStream.Write(boundaryBytes, 0, boundaryBytes.Length)

                requestStream.Write(formItemBytes, 0, formItemBytes.Length)

                Using fileStream As New FileStream(files(key), FileMode.Open, FileAccess.Read)
                    While (BytesDataHelper(bytesRead, fileStream.Read(buffer, 0, buffer.Length))) <> 0
                        requestStream.Write(buffer, 0, bytesRead)
                    End While
                End Using
            End If
        Next
    End If
    requestStream.Write(trailer, 0, trailer.Length)
    requestStream.Close()
    Dim reader As New StreamReader(request.GetResponse().GetResponseStream())
    res = reader.ReadToEnd()
    Return res

End Function
Private Shared Function BytesDataHelper(Of T)(ByRef target As T, ByVal value As T) As T
    target = value
    Return value
End Function
 End Class
导入System.Collections.Specialized
导入System.IO
导入系统.Net
公共类数据上传
作为字符串的Dim res
公共函数sendHttpRequest(url为字符串,值为
NameValueCollection,可选文件为NameValueCollection=Nothing)为
一串
尺寸边界为字符串=“------------------------------------”+
DateTime.Now.Ticks.ToString(“x”)
Dim boundaryBytes As Byte()=System.Text.Encoding.UTF8.GetBytes((Convert.ToString(vbCr&vbLf&“-”)&boundary)+vbCr&vbLf)
以字节()的形式调整尾部尺寸=System.Text.Encoding.UTF8.GetBytes((Convert.ToString(vbCr&vbLf&“--”)和boundary)+“--”&vbCr&vbLf)
Dim boundaryBytesF As Byte()=System.Text.Encoding.ASCII.GetBytes((Convert.ToString(“--”)和boundary)+vbCr和vbLf)
Dim请求作为HttpWebRequest=DirectCast(WebRequest.Create(url),HttpWebRequest)
request.ContentType=Convert.ToString(“多部分/表单数据;boundary=”)&boundary
request.Method=“POST”
request.KeepAlive=True
request.Credentials=System.Net.CredentialCache.DefaultCredentials
Dim requestStream As Stream=request.GetRequestStream()
将每个键作为值中的字符串。键
Dim cntDisp=“内容处置:表单数据;名称=”“{0}”“;”&vbCr&vbLf&vbCr&vbLf&“{1}”
Dim formItemBytes As Byte()=System.Text.Encoding.UTF8.GetBytes(String.Format(cntDisp,key,values(key)))
写入(boundaryBytes,0,boundaryBytes.Length)
requestStream.Write(formItemBytes,0,formItemBytes.Length)
下一个
Dim计数=0
如果文件不是空的,那么
对于文件中的每个键作为字符串。键
如果File.Exists(files(key))则
Dim字节读取为整数=0
作为字节()的Dim缓冲区=新字节(2048){}
Dim cnt As String=“内容处置:表单数据;name=”“{0}”“;filename=“{1}”“”&vbCr&vbLf
Dim cntype为String=“内容类型:应用程序/八位字节流”&vbCr&vbLf&vbCr&vbLf
Dim formItemBytes As Byte()=System.Text.Encoding.UTF8.GetBytes(String.Format(cnt&cntype,key,files(key)))
写入(boundaryBytes,0,boundaryBytes.Length)
requestStream.Write(formItemBytes,0,formItemBytes.Length)
将fileStream用作新的fileStream(文件(键)、FileMode.Open、FileAccess.Read)
而(BytesDataHelper(bytesRead,fileStream.Read(buffer,0,buffer.Length)))0
写入(缓冲区,0,字节读取)
结束时
终端使用
如果结束
下一个
如果结束
requestStream.Write(拖车,0,拖车长度)
requestStream.Close()
将读卡器设置为新的StreamReader(request.GetResponse().GetResponseStream())
res=reader.ReadToEnd()
返回res
端函数
私有共享函数BytesDataHelper(Of T)(ByRef目标为T,ByVal值为T)为T
目标=价值
返回值
端函数
末级
为什么要添加C#标记?函数在C#上,我转换为vb,假设问题可能是转换错误,有人可以指导我。注意
Imports System.Collections.Specialized
Imports System.IO
Imports System.Net

Public Class DataUpload
Dim res As String
Public Function sendHttpRequest(url As String, values As 
NameValueCollection, Optional files As NameValueCollection = Nothing) As 
String
    Dim boundary As String = "----------------------------" + 
  DateTime.Now.Ticks.ToString("x")
    Dim boundaryBytes As Byte() = System.Text.Encoding.UTF8.GetBytes((Convert.ToString(vbCr & vbLf & "--") & boundary) + vbCr & vbLf)
    Dim trailer As Byte() = System.Text.Encoding.UTF8.GetBytes((Convert.ToString(vbCr & vbLf & "--") & boundary) + "--" & vbCr & vbLf)
    Dim boundaryBytesF As Byte() = System.Text.Encoding.ASCII.GetBytes((Convert.ToString("--") & boundary) + vbCr & vbLf)
    Dim request As HttpWebRequest = DirectCast(WebRequest.Create(url), HttpWebRequest)
    request.ContentType = Convert.ToString("multipart/form-data; boundary=") & boundary
    request.Method = "POST"
    request.KeepAlive = True
    request.Credentials = System.Net.CredentialCache.DefaultCredentials
    Dim requestStream As Stream = request.GetRequestStream()

    For Each key As String In values.Keys
        Dim cntDisp = "Content-Disposition: form-data; name=""{0}"";" & vbCr & vbLf & vbCr & vbLf & "{1}"
        Dim formItemBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(String.Format(cntDisp, key, values(key)))
        requestStream.Write(boundaryBytes, 0, boundaryBytes.Length)
        requestStream.Write(formItemBytes, 0, formItemBytes.Length)
    Next
    Dim count = 0
    If files IsNot Nothing Then

        For Each key As String In files.Keys
            If File.Exists(files(key)) Then
                Dim bytesRead As Integer = 0
                Dim buffer As Byte() = New Byte(2048) {}
                Dim cnt As String = "Content-Disposition: form-data; name=""{0}""; filename=""{1}""" & vbCr & vbLf
                Dim cntype As String = "Content-Type: application/octet-stream" & vbCr & vbLf & vbCr & vbLf
                Dim formItemBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(String.Format(cnt & cntype, key, files(key)))
                requestStream.Write(boundaryBytes, 0, boundaryBytes.Length)

                requestStream.Write(formItemBytes, 0, formItemBytes.Length)

                Using fileStream As New FileStream(files(key), FileMode.Open, FileAccess.Read)
                    While (BytesDataHelper(bytesRead, fileStream.Read(buffer, 0, buffer.Length))) <> 0
                        requestStream.Write(buffer, 0, bytesRead)
                    End While
                End Using
            End If
        Next
    End If
    requestStream.Write(trailer, 0, trailer.Length)
    requestStream.Close()
    Dim reader As New StreamReader(request.GetResponse().GetResponseStream())
    res = reader.ReadToEnd()
    Return res

End Function
Private Shared Function BytesDataHelper(Of T)(ByRef target As T, ByVal value As T) As T
    target = value
    Return value
End Function
 End Class