michael112
Goto Top

Mit C sharp eine csv Datei an ein PHP script senden

Guten Tag Community,
ich versuche mithilfe meines C# Programms eine csv Datei an eine PHP seite zu schicken.
Das File muss im POST die Zugangsdaten übermitteln ansonsten wird das File nicht angenommen.
$_POST["username"] gibt den Benutzer an
$_POST["token"] gibt das benutzerpassword an
$_POST["service"] gibt an welche datei übermittelt wird
$_FILE["updatefile"] soll das csv File beinhalten pfad z.B C:\test.csv

Die benutzerauthentifizierung funktioniert bereits. Ich bekomme die Antwort, dass meine Zugangsdaten stimmen.
Wie hänge ich jetzt das csv File an die POST an?


Mein bisheriger Code:

public void AnServerSenden()
        {
            string URL = ConfigurationManager.AppSettings["SrvAdr"];  
            WebClient webClient = new WebClient();
            
            NameValueCollection formData = new NameValueCollection();
            formData["username"] = "username";  
            formData["token"] = "passwordtoken";  
            formData["service"] = "3";  
            

            byte responseBytes = webClient.UploadValues(URL, "POST", formData);  

            string responsefromserver = Encoding.UTF8.GetString(responseBytes);
            
            MessageBox.Show(responsefromserver);
            webClient.Dispose();


        }


Grüße
Michael

Content-Key: 368767

Url: https://administrator.de/contentid/368767

Printed on: April 19, 2024 at 09:04 o'clock

Member: SlainteMhath
SlainteMhath Mar 21, 2018 at 09:08:25 (UTC)
Goto Top
Member: michael112
michael112 Mar 21, 2018 at 09:23:56 (UTC)
Goto Top
Hallo Slainte,
wenn ich wie in den Beispielen versuche klappt die Authentifizierung nicht mehr.

Grüße
Michael
Member: SlainteMhath
SlainteMhath Mar 21, 2018 at 10:13:34 (UTC)
Goto Top
d.h.? Was kommt im PHP Script an? Das Form dazu muss afaik als content-type "multipart/form-data" gesetzt haben.
Member: michael112
michael112 Mar 23, 2018 at 13:17:59 (UTC)
Goto Top
Hallo Slainte,
hier mein PHP script
<?php
require_once './classes/account/class.accountdao.php';  
if (isset($_POST["username"]) && isset($_POST["token"]) && isset($_POST["service"])) {  
    $response = AccountDAO::doServiceLogin($_POST["username"], $_POST["token"]);  
    switch ($response) {
        case 1:
            echo "Benutzername oder Passwort falsch!";  
            break;
        case 2:
            echo "Programmlaufzeit erloschen. Bitte kontaktieren Sie Ihren Service!";  
            break;
        case 0:
            
            if ($_POST["service"] == 3) {  
                echo "OK";  
            } else if ($_POST["service"] == 2 || $_POST["service"] == 1) {  
                
                // Artikel || Warengruppen Upload
               
                if(!empty($_FILES["updatefile"]) && $_FILES["updatefile"]["error"] ==0){  
                    $csvAsArray = array_map('str_getcsv', file($_FILES['updatefile']['tmp_name']));  
                    print_r($csvAsArray);
                    
                    
                    //TODO: CSV Datei in Datenbank einspielen
                    
                    
                    
                    AccountDAO::updateLastServiceUpdate($_POST["username"]);  
                }else{
                    echo "Parameter nicht gesetzt";  
                }        
            } else {
                echo "Parameter nicht gesetzt";  
            }
            break;
    }
} else
    echo "Parameter nicht gesetzt";  

?>


und das ist mein C# code
string URL = ConfigurationManager.AppSettings["SrvAdr"];  
            WebClient webClient = new WebClient();
            string boundaryString = "--------------";  
            NameValueCollection formData = new NameValueCollection();
            formData["username"] = "icitsoftware";  
            formData["token"] = "ee977806d7286510da8b9a7492ba58e2484c0ecc";  
            formData["service"] = "3";  
            


            byte responseBytes = webClient.UploadValues(URL, "POST", formData);  
            MemoryStream postDataStream = new MemoryStream();
            StreamWriter postDataWriter = new StreamWriter(postDataStream);

 string responsefromserver = Encoding.UTF8.GetString(responseBytes);
            
            MessageBox.Show(responsefromserver);
            webClient.Dispose();


Mit Diesem Code schaffe ich die Authentifizierung und erhalte das "OK" vom Server.
ich muss aber mit deiser Namevaluecollection auch eine Datei mitsenden.
Was muss ich dafür verwenden ich bin am verzweifeln.

Grüße
Member: SlainteMhath
SlainteMhath Mar 23, 2018 at 13:42:11 (UTC)
Goto Top
hier mein PHP script
...
und das ist mein C# code
Schön. Beantwortet aber nicht meine Frage face-smile
Member: michael112
michael112 Mar 23, 2018 updated at 13:54:12 (UTC)
Goto Top
ja die habe ich auch nicht verstanden XD

Also im PHP kommt noch gar nix an auser die "formData" und die passt soweit.
Ich verstehe nicht wie ich eine Datei mitschicken kann

Grüße
Member: michael112
michael112 Mar 23, 2018 at 14:43:21 (UTC)
Goto Top
Danke für deine Nerven Slainte

ich habe jetzt ein ähnliches Problem.

Wie bekomme ich diese Parameter:
NameValueCollection formData = new NameValueCollection(); 

            formData["username"] = "username";   

            formData["token"] = "passwordtoken";   

            formData["service"] = "3";   

in diesen Code hinein

HttpWebRequest requestToServerEndpoint =
            (HttpWebRequest)WebRequest.Create("http://www.you-order.it/testfile.php");  

            string boundaryString = "----SomeRandomText";  
            string fileUrl = @"C:\artikel.csv";  

            // Set the http request header 
        
            requestToServerEndpoint.Method = WebRequestMethods.Http.Post;
            requestToServerEndpoint.ContentType = "multipart/form-data; boundary=" + boundaryString;  
            requestToServerEndpoint.KeepAlive = true;
            requestToServerEndpoint.Credentials = System.Net.CredentialCache.DefaultCredentials;
            

            // Use a MemoryStream to form the post data request,
            // so that we can get the content-length attribute.
            MemoryStream postDataStream = new MemoryStream();
            StreamWriter postDataWriter = new StreamWriter(postDataStream);

            // Include value from the myFileDescription text area in the post data
           
            postDataWriter.Write("\r\n--" + boundaryString + "\r\n");  
            postDataWriter.Write("Content-Disposition:form-data; name=\"{0}\"\r\n\r\n{1}",  
            "updatefile",  
            "artikel");  

            // Include the file in the post data
            postDataWriter.Write("\r\n--" + boundaryString + "\r\n");  
            postDataWriter.Write("Content-Disposition: form-data;"  
            + "name=\"{0}\";"  
            + "filename=\"{1}\""  
            + "\r\nContent-Type: {2}\r\n\r\n",  
            "updatefile",  
            Path.GetFileName(fileUrl),
            Path.GetExtension(fileUrl));
            postDataWriter.Flush();

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

            postDataWriter.Write("\r\n--" + boundaryString + "--\r\n");  
            postDataWriter.Flush();

            // Set the http request body content length
            requestToServerEndpoint.ContentLength = postDataStream.Length;

            // Dump the post data from the memory stream to the request stream
            using (Stream s = requestToServerEndpoint.GetRequestStream())
            {
                postDataStream.WriteTo(s);
            }
            postDataStream.Close();
            // Grab the response from the server. WebException will be thrown
            // when a HTTP OK status is not returned
            WebResponse response = requestToServerEndpoint.GetResponse();
            StreamReader responseReader = new StreamReader(response.GetResponseStream());
            string replyFromServer = responseReader.ReadToEnd();
            MessageBox.Show(replyFromServer);
Mitglied: 135799
135799 Mar 23, 2018 updated at 15:26:22 (UTC)
Goto Top
Folgende Using's:
using System;
using System.Windows.Forms;
using System.Net.Http;
using System.IO;

Dann mit folgendem Code (Errorhandling der Übersicht weggelassen)
private void Upload(){
 string URL = @"http://domain.tld/upload.php";  
 byte fileData = File.ReadAllBytes(@"D:\Ordner\update.csv");  

 using (HttpClient client = new HttpClient()) {
    HttpContent paramUsername = new StringContent("DEINUSERNAME");  
    HttpContent paramToken = new StringContent("DEINTOKEN");  
    HttpContent paramService = new StringContent("3");  
    HttpContent paramFile = new ByteArrayContent(fileData);
    
    using (MultipartFormDataContent formData = new MultipartFormDataContent()) {
        formData.Add(paramUsername, "username");  
        formData.Add(paramToken, "token");  
        formData.Add(paramService, "service");  
        formData.Add(paramFile, "updatefile", "update.csv");  

        var response = client.PostAsync(URL, formData).Result;
        if (response.IsSuccessStatusCode) {
            MessageBox.Show(response.Content.ReadAsStringAsync().Result);
        } else {
            MessageBox.Show(response.ReasonPhrase);
        }
    }
 }
}
Funktioniert hier problemlos.

Gruß Schnuffi
Member: michael112
michael112 Mar 23, 2018 at 15:38:09 (UTC)
Goto Top
Danke Schnuffi
jetzt passt alles

Bin dir was schuldig