从C#发送到PHP的Base64编码图像数据会产生损坏的显示图像

时间:2014-05-30 17:24:00

标签: c# php image encoding base64

昨天我问了一个问题并实现了一个答案,关于如何将图像数据从C#应用程序发送到PHP网页,准备接收POST数据,解码并显示图像。

这是C#代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Collections.Specialized;

namespace ConsoleApplication1

{



 class Program
{       

    public static void Main()
    {
        // Load a image
        System.Drawing.Image myImage = GetImage("http://upload.wikimedia.org/wikipedia/commons/5/5b/Ultraviolet_image_of_the_Cygnus_Loop_Nebula_crop.jpg");

        // Convert to base64 encoded string
        string base64Image = ImageToBase64(myImage, System.Drawing.Imaging.ImageFormat.Jpeg);

        // Post image to upload handler
        using (WebClient client = new WebClient())
        {
            byte[] response = client.UploadValues("www.myurl.com", new NameValueCollection()
            {
                { "myImageData", base64Image }
            });

            Console.WriteLine("Server Said: " + System.Text.Encoding.Default.GetString(response));
        }

        Console.ReadKey();
    }

    static System.Drawing.Image GetImage(string filePath)
    {
        WebClient l_WebClient = new WebClient();
        byte[] l_imageBytes = l_WebClient.DownloadData(filePath);
        MemoryStream l_stream = new MemoryStream(l_imageBytes);
        return Image.FromStream(l_stream);
    }

    static string ImageToBase64(System.Drawing.Image image, System.Drawing.Imaging.ImageFormat format)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            // Convert Image to byte[]
            image.Save(ms, format);
            byte[] imageBytes = ms.ToArray();

            // Convert byte[] to Base64 String
            string base64String = Convert.ToBase64String(imageBytes);
            return base64String;
        }
    }
}

}

这是PHP代码:

   <?php 

// Handle Post
if (count($_POST))
{
    // Save image to file
    $imageData = base64_decode($_POST['myImageData']);

    // Write Image to file
    $h = fopen('test.jpg', 'w');
    fwrite($h, $imageData);
    fclose($h);

    // Success
    exit('Image successfully uploaded.');
}

// Display Image
if (file_exists('test.jpg'))
{
    echo '<img src="test.jpg?_='. filemtime('test.jpg') .'" />';
}
else
{
    echo "Image not uploaded yet.";
}

?>

一切似乎都达到了一定程度 - 我收到一条控制台消息,说明图片已成功上传,但是当我访问我的网页时,我得到一张破损的图片,而不是声明&#34;图片没有已上传&#34;。从这一点来看,我认为我可以得出结论,一切至少足以将数据从C#发送到PHP - 它似乎只是图像本身的编码/解码不能正常工作。奇怪的是,在这个项目的早期,我们正在做类似的编码和解码图像,但python代码只适用于Linux - 而不是Windows。 Linux会提供正确的图像,窗口只显示具有相同代码的损坏图像。

关于问题是什么以及如何解决问题的任何想法?

1 个答案:

答案 0 :(得分:0)

如果您选择其他(较小)的图片,例如http://upload.wikimedia.org/wikipedia/commons/thumb/9/98/Banteay_Kdei%2C_Angkor%2C_Camboya%2C_2013-08-16%2C_DD_15.JPG/640px-Banteay_Kdei%2C_Angkor%2C_Camboya%2C_2013-08-16%2C_DD_15.JPG,那么它的效果会很好。

因此,我担心您已达到发布数据的上传限制,默认情况下,该数据应为8MB。您尝试上传的图片为12MB,Base64编码的图片接近20MB。

可以修改post_max_size中的

php.ini以增加帖子限制。但我强烈建议切换到常规文件上传。请参阅WebClient.uploadFile(http://msdn.microsoft.com/en-us/library/36s52zhs(v=vs.110).aspx)。