【发布时间】:2013-03-20 17:52:30
【问题描述】:
我正在开发一个 Windows Phone 应用程序,它使用 PHP 将用户选择的照片上传到服务器。 为此,我正在尝试将图像转换为 base64 并将其发布到 PHP 中,然后将其解码回 JPG 图像。
base64 字符串已成功发布到 PHP,但我总是在服务器上得到一个损坏的 JPG 文件而不是原始图像(这意味着图像的编码/解码存在一些错误)。
Application 的 C# 代码是:
public partial class SamplePage : PhoneApplicationPage
{
public SamplePage()
{
InitializeComponent();
}
PhotoChooserTask selectphoto = null;
private void SampleBtn_Click(object sender, RoutedEventArgs e)
{
selectphoto = new PhotoChooserTask();
selectphoto.Completed += new EventHandler<PhotoResult>(selectphoto_Completed);
selectphoto.Show();
}
void selectphoto_Completed(object sender, PhotoResult e)
{
if (e.TaskResult == TaskResult.OK)
{
BinaryReader reader = new BinaryReader(e.ChosenPhoto);
image1.Source = new BitmapImage(new Uri(e.OriginalFileName));
txtBX.Text = e.OriginalFileName;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://"+QR_Reader.MainPage.txtBlck+"/beamer/saveimage.php");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
Stream photoStream = ImageToStream(image1);
BitmapImage bimg = new BitmapImage();
bimg.SetSource(photoStream); //photoStream is a stream containing data for a photo
byte[] bytearray = null;
using (MemoryStream ms = new MemoryStream())
{
WriteableBitmap wbitmp = new WriteableBitmap(bimg);
wbitmp.SaveJpeg(ms, wbitmp.PixelWidth, wbitmp.PixelHeight, 0, 100);
ms.Seek(0, SeekOrigin.Begin);
bytearray = ms.GetBuffer();
}
string str = Convert.ToBase64String(bytearray);
string postData = String.Format("image={0}", str);
// Getting the request stream.
request.BeginGetRequestStream
(result =>
{
// Sending the request.
using (var requestStream = request.EndGetRequestStream(result))
{
using (StreamWriter writer = new StreamWriter(requestStream))
{
writer.Write(postData);
writer.Flush();
}
}
// Getting the response.
request.BeginGetResponse(responseResult =>
{
var webResponse = request.EndGetResponse(responseResult);
using (var responseStream = webResponse.GetResponseStream())
{
using (var streamReader = new StreamReader(responseStream))
{
string srresult = streamReader.ReadToEnd();
}
}
}, null);
}, null);
} // end of taskresult == OK
} // end of select photo completed
private Stream ImageToStream(Image image1)
{
WriteableBitmap wb = new WriteableBitmap(400, 400);
wb.Render(image1, new TranslateTransform { X = 400, Y = 400 });
wb.Invalidate();
Stream myStream = new MemoryStream();
wb.SaveJpeg(myStream, 400, 400, 0, 70);
return myStream;
}
} // End of Class
服务器端解码保存图片的PHP代码为:
<?php
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_image($_POST['image'], "img.jpg");
}
else
die("no image data found");
?>
我不知道这里出了什么问题。 我一直在寻找几个小时来做到这一点,但我仍然失败了。
请帮帮我。
编辑: 我刚刚发现无论我选择什么图像,我总是得到相同的 base64 字符串。 这是base64转换后得到的: http://textuploader.com/?p=6&id=vWZy
我现在真的很困惑。我为每个非常图像得到相同的输出。 我不知道为什么会这样。
我真的很想这样做,但我被困在这里,使用 base64 编码。 请帮帮我。
【问题讨论】:
标签: c# windows-phone-7 file-upload base64 decoding