PHP - byte []到Blob

时间:2014-08-17 17:21:00

标签: c# php xamarin

我正在尝试使用HTTP Post发送byte[]作为图像存储到MySQL数据库中,但它没有正确编码byte[]或者我只是做了一些非常错误的事情。< / p>

C#代码

public async Task<string> Post (byte[] image)
    {
        string data = data = string.Format ("METHOD=post&Image={0}", image);

        HttpWebRequest r = await Info.createRequest (data);
        using (var resp = await Task.Factory.FromAsync<WebResponse> (r.BeginGetResponse, r.EndGetResponse, null)) {
            return "Finished";
        }
    }

/*Info.createRequest(data)*/
public static async Task<HttpWebRequest> createRequest (string json, string ContentType = "application/x-www-form-urlencoded", byte[] img = null)
    {
        (new CancellationTokenSource ()).Dispose ();
        var request = WebRequest.Create (BaseUrl) as HttpWebRequest; 
        request.Method = "POST";
        request.ContentType = ContentType;

        byte[] postData = Encoding.UTF8.GetBytes (json);

        using (var stream = await Task.Factory.FromAsync<Stream> (request.BeginGetRequestStream, request.EndGetRequestStream, request)) {
            await stream.WriteAsync (postData, 0, postData.Length);
            /*if (img != null)
                await stream.WriteAsync (img, 0, img.Length);*/
            //^ Didn't seme to work. 
        }

        return request;
    }

PHP代码

$null = NULL;
        $stmt = $this->db->prepare("INSERT INTO Posts (Image) VALUES (?)");
        $stmt->bind_param("b", $_POST["Image"]);
        $stmt->execute();
        $stmt->close();

2 个答案:

答案 0 :(得分:2)

使用.NET 4.5(您可以通过添加NuGet中的Microsoft.Net.Http包来使用.NET 4.0),可以更轻松地模拟表单请求。

以下是一个例子:

private System.IO.Stream Upload(string actionUrl, string paramString, Stream paramFileStream, byte [] paramFileBytes)
{
    HttpContent stringContent = new StringContent(paramString);
    HttpContent fileStreamContent = new StreamContent(paramFileStream);
    HttpContent bytesContent = new ByteArrayContent(paramFileBytes);
    using (var client = new HttpClient())
    using (var formData = new MultipartFormDataContent())
    {
        formData.Add(stringContent, "param1", "param1");
        formData.Add(fileStreamContent, "file1", "file1");
        formData.Add(bytesContent, "file2", "file2");
        var response = client.PostAsync(actionUrl, formData).Result;
        if (!response.IsSuccessStatusCode)
        {
            return null;
        }
        return response.Content.ReadAsStreamAsync().Result;
    }
}

答案 1 :(得分:2)

string.Format("METHOD=post&Image={0}", image);

会产生类似的东西:

METHOD=post&Image=System.Byte[]

因此实际上不会发送任何有用的东西。

如果要发布二进制数据,可以使用Base64 encoding

String base64 = System.Convert.ToBase64String(image)
string.Format("METHOD=post&Image={0}", base64 );

我不确定在PHP中如何完成反向操作,但我认为这是使用base64_decode的东西:

$base64Image = base64_decode($_POST["Image"]);