Upload image using HttpClient

32,659

Okay after hours of researching I came to the point that I should restart from draft. I simulate a Html form upload with following 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;
        }

And my php file to receive the data looks as the 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);
?>

Now it works as it should and I hope somebody can reuse my code.

Share:
32,659
Elektropepi
Author by

Elektropepi

Updated on December 16, 2020

Comments

  • Elektropepi
    Elektropepi over 3 years

    I want to upload a file using HttpClient to a php script to save it on a server in a Windows Phone 8.1 application.

    Here is my C# code I got from this post.

    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;
    
         }
    }
    

    And with this code I retrieve the data in the php script

    <?
    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");
    ?>
    

    But the result I always get is "No Data found" although there IS an image file. Am I doing something wrong passing it as a POST parameter?