2014-12-11 17 views
5

Ich möchte eine Datei mit HttpClient in ein PHP-Skript hochladen, um sie auf einem Server in einer Windows Phone 8.1-Anwendung zu speichern.Bild mit HttpClient hochladen

Hier ist mein C# -Code, den ich von this post bekommen habe.

private async Task<string> GetRawDataFromServer(byte[] data) 
{ 
    //Debug.WriteLine("byte[] data length:" + Convert.ToBase64String(data).Length); 
    var requestContent = new MultipartFormDataContent(); 
    // here you can specify boundary if you need---^ 
    var imageContent = new ByteArrayContent(data); 
    imageContent.Headers.ContentType = 
     MediaTypeHeaderValue.Parse("image/jpeg"); 

    requestContent.Add(imageContent, "image", "image.jpg"); 
    using (var client = new HttpClient()) 
    { 

     client.BaseAddress = new Uri("http://www.x.net/"); 

     var result = client.PostAsync("test/fileupload.php", requestContent).Result; 

     return result.Content.ReadAsStringAsync().Result; 

    } 
} 

Und mit diesem Code abrufen ich die Daten in der PHP-Skript

<? 
function base64_to_image($imageData, $outputfile) { 
    /* encode & write data (binary) */ 
    $ifp = fopen($outputfile, "wb"); 
    fwrite($ifp, base64_decode($imageData)); 
    fclose($ifp); 
    /* return output filename */ 
    return($outputfile); 
}  

if (isset($_POST['image'])) { 
    base64_to_jpeg($_POST['image'], "image.jpg"); 
} 
else 
    die("no image data found"); 
?> 

Aber das Ergebnis bekomme ich immer „Keine Daten gefunden“ obwohl Datei ein Bild ist. Mache ich etwas falsch, indem ich es als POST-Parameter übergebe?

+0

Für eine Sache, anstatt ".Result" für die Async-Methoden zu verwenden, sollten Sie stattdessen "erwarten" (der Compiler sollte Sie gewarnt haben, dass Sie Async falsch verwendet haben). Haben Sie eine Netzwerkverfolgung durchgeführt, um zu sehen, was über die Leitung gesendet wird? –

+0

Nein, um ehrlich zu sein, ich weiß nicht, wie ich das machen soll. – Elektropepi

Antwort

19

Okay nach Stunden der Forschung kam ich zu dem Punkt, dass ich vom Entwurf neu starten sollte. ich simulieren ein HTML-Formular Upload mit folgenden C# -Code:

private async Task<string> UploadImage(StorageFile file) 
     { 
      HttpClient client = new HttpClient(); 
      client.BaseAddress = new Uri("http://your.url.com/"); 
      MultipartFormDataContent form = new MultipartFormDataContent(); 
      HttpContent content = new StringContent("fileToUpload"); 
      form.Add(content, "fileToUpload"); 
      var stream = await file.OpenStreamForReadAsync(); 
      content = new StreamContent(stream); 
      content.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") 
      { 
       Name = "fileToUpload", 
       FileName = file.Name 
      }; 
      form.Add(content); 
      var response = await client.PostAsync("upload.php", form); 
      return response.Content.ReadAsStringAsync().Result; 
     } 

Und meine PHP-Datei sieht die Daten zu empfangen, wie die follwing:

<?php 
$uploaddir = 'uploads/'; 
$uploadfile = $uploaddir . basename($_FILES['fileToUpload']['name']); 
echo '<pre>'; 
if (move_uploaded_file($_FILES['fileToUpload']['tmp_name'], $uploadfile)) { 
    echo "File is valid, and was successfully uploaded.\n"; 
} else { 
    echo "Possible file upload attack!\n"; 
} 

echo 'Here is some more debugging info:'; 
print_r($_FILES); 
?> 

Jetzt funktioniert es, wie es sollte, und ich jemand hoffen kann Verwende meinen Code.

+0

Danke Kumpel für die Hilfe da! –

+0

Danke Bro .....! –

+0

Was ist der Unterschied zwischen http://your.url.com/ von client.BaseAddress = new Uri ("http://your.url.com/") und upload.php von var response = await client.PostAsync ("upload.php", Formular); ? – iamatsundere181