2016-12-03 12 views
0

私は.NETを初めて使い、CURLFileのようなものをC#やVB.NETに入れたいと思っています。 PHPで 我々はこれを使用します。ASP.NETのPHP CURLFileのようなもの

$post_fields = array(
    'id' => $id, 
    'document' => new CURLFile(realpath("ufile/data.txt")), 
    'caption' => $caption 
); 
$url = 'https://www.example.com/gdata/'; 

function makeCurl($method, $datas) 
{ 
    global $url; 
    $ch = curl_init($url . $method); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $datas); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
    $server_output = curl_exec($ch); 
    echo $server_output; 
    curl_close($ch); 
    return $server_output; 
} 
makeCurl("sendingFile", $post_fields); 

どのように私はC#やVB.NETでそのような他のパラメータを使用してファイルの内容を送信することができますか?

UPDATE: @MrGadgetのコメントによると: 私は私が持っているside.Only情報を受信に関する多くの情報を持っていけないという方は、「multipart/form-data」を期待して唯一の応答が「OK」である場合、または"要求の形式が正しくありません"。上のPHPコードでは、常に "ok"になります。今のところWebRequest.Createを呼び出して上記のコードを使ってphpファイルを呼び出し、ファイルを送信します。私はちょうど.Netでそれをやろうとすると、PHPを呼び出す渡します。

+0

は[本](https://msdn.microsoft.com/en-us/library/debx8sh9(V = VS .110).aspx?cs-save-lang = 1&cs-lang = vb#code-snippet-27)あなたが探しているのは? – MrGadget

+0

@MrGadgetいいえ、私はポストデータ用にWebClient.OpenReadを使用しました。私の問題は、 "他のパラメータでファイルの内容を送信する"です、ありがとう。 – nevin2007

+0

あなたは受信側について十分に話していません...それは何を期待していますか? Webフォームハンドラ、汎用データハンドラ、Webサービスである可能性があります。私たちはカールについて何も知らないと仮定します...あなたが実際に達成しようとしていることを教えてください。 – MrGadget

答えて

0

見つかったthis ...テストされていないか洗練されていません。

VBコード:

Imports System.Security.Cryptography 
Imports System.Collections.Specialized 
Imports System.IO 

Public Shared Sub HttpUploadFile(url As String, file As String, paramName As String, contentType As String, nvc As NameValueCollection) 
    Dim boundary As String = "---------------------------" + DateTime.Now.Ticks.ToString("x") 
    Dim boundarybytes As Byte() = Text.Encoding.ASCII.GetBytes((Convert.ToString(vbCr & vbLf & "--") & boundary) + vbCr & vbLf) 

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

    Dim rs As Stream = wr.GetRequestStream() 

    Dim formdataTemplate As String = "Content-Disposition: form-data; name=""{0}""" & vbCrLf & vbCrLf & "{1}" 
    For Each key As String In nvc.Keys 
     rs.Write(boundarybytes, 0, boundarybytes.Length) 
     Dim formitem As String = String.Format(formdataTemplate, key, nvc(key)) 
     Dim formitembytes As Byte() = Text.Encoding.UTF8.GetBytes(formitem) 
     rs.Write(formitembytes, 0, formitembytes.Length) 
    Next 
    rs.Write(boundarybytes, 0, boundarybytes.Length) 

    Dim headerTemplate As String = "Content-Disposition: form-data; name=""{0}""; filename=""{1}""" & vbCrLf & "Content-Type: {2}" & vbCrLf & vbCrLf 
    Dim header As String = String.Format(headerTemplate, paramName, file, contentType) 
    Dim headerbytes As Byte() = Text.Encoding.UTF8.GetBytes(header) 
    rs.Write(headerbytes, 0, headerbytes.Length) 

    Dim fileStream As New FileStream(file, FileMode.Open, FileAccess.Read) 
    Dim buffer As Byte() = New Byte(4095) {} 
    Dim bytesRead As Integer = 0 
    While (InlineAssignHelper(bytesRead, fileStream.Read(buffer, 0, buffer.Length))) <> 0 
     rs.Write(buffer, 0, bytesRead) 
    End While 
    fileStream.Close() 

    Dim trailer As Byte() = Text.Encoding.ASCII.GetBytes((Convert.ToString(vbCrLf & "--") & boundary) + "--" & vbCrLf) 
    rs.Write(trailer, 0, trailer.Length) 
    rs.Close() 

    Dim wresp As WebResponse = Nothing 
    Try 
     wresp = wr.GetResponse() 
     Dim stream2 As Stream = wresp.GetResponseStream() 

     Dim reader2 As New StreamReader(stream2) 
    Catch ex As Exception 

     If wresp IsNot Nothing Then 
      wresp.Close() 
      wresp = Nothing 
     End If 
    Finally 
     wr = Nothing 
    End Try 
End Sub 

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

オリジナルC#コード:

public static void HttpUploadFile(string url, string file, string paramName, string contentType, NameValueCollection nvc) { 
    string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x"); 
    byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n"); 

    HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url); 
    wr.ContentType = "multipart/form-data; boundary=" + boundary; 
    wr.Method = "POST"; 
    wr.KeepAlive = true; 
    wr.Credentials = System.Net.CredentialCache.DefaultCredentials; 

    Stream rs = wr.GetRequestStream(); 

    string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}"; 
    foreach (string key in nvc.Keys) 
    { 
     rs.Write(boundarybytes, 0, boundarybytes.Length); 
     string formitem = string.Format(formdataTemplate, key, nvc[key]); 
     byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem); 
     rs.Write(formitembytes, 0, formitembytes.Length); 
    } 
    rs.Write(boundarybytes, 0, boundarybytes.Length); 

    string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n"; 
    string header = string.Format(headerTemplate, paramName, file, contentType); 
    byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header); 
    rs.Write(headerbytes, 0, headerbytes.Length); 

    FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read); 
    byte[] buffer = new byte[4096]; 
    int bytesRead = 0; 
    while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) { 
     rs.Write(buffer, 0, bytesRead); 
    } 
    fileStream.Close(); 

    byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n"); 
    rs.Write(trailer, 0, trailer.Length); 
    rs.Close(); 

    WebResponse wresp = null; 
    try { 
     wresp = wr.GetResponse(); 
     Stream stream2 = wresp.GetResponseStream(); 
     StreamReader reader2 = new StreamReader(stream2); 

    } catch(Exception ex) { 

     if(wresp != null) { 
      wresp.Close(); 
      wresp = null; 
     } 
    } finally { 
     wr = null; 
    } 
} 
関連する問題