Swift - 将base64编码的图像上传到php并显示图像

4

目前,我正在尝试上传一个base64编码的图像到一个PHP服务器,该服务器然后将base64字符串存储在MySQL数据库中。目前,代码正在上传数据并将其存储到MySQL数据库中。然而,当我尝试通过指定用于检索图像的URL来检索图像时,会显示一个带有问号的丢失图像链接。我不知道为什么会发生这种情况,因为使用我的Android应用程序上传和显示base64编码的图像似乎都正常工作。

以下是我正在使用的Swift代码来编码和上传到服务器:

    let image: UIImage = imgProfilePic.image!

    let size = CGSizeApplyAffineTransform(image.size, CGAffineTransformMakeScale(0.3, 0.3))
    let hasAlpha = false
    let scale: CGFloat = 0.0 // Automatically use scale factor of main screen

    UIGraphicsBeginImageContextWithOptions(size, !hasAlpha, scale)
    image.drawInRect(CGRect(origin: CGPointZero, size: size))

    let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    var imageData = UIImageJPEGRepresentation(scaledImage, 0.9)
    var base64String = imageData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) // encode the image

    var cd = CoreDataUser(pstrContext: "this")

    var params = "strUsername=" + cd.getUsername()
    params = params + "&strPassword=" + cd.getPassword()
    params = params + "&blbProfilePic=" + base64String

以下是 PHP 代码,用于解码并在浏览器中显示 base64 字符串。这对于由我的 Android 代码上传的图像运作良好,但对于由我的 Swift 代码上传的图像,它只显示一个损坏的图像链接。

 if ($rows) { 
    foreach ($rows as $row) { 
    $data = base64_decode($row["fblbProfilePic"]);
    $image = imagecreatefromstring($data);
    header('Content-Type: Image/jpeg');
    imagejpeg($image);
//file_put_contents("test.jpg", $data);
//var_dump($data);

    //echo base64_decode($row["fblbPicture"]);
    /    /echo '<img src="data:image/jpg;base64,' . $row["fblbPicture"]     . '" />';
     }

请分享您下载并解码为base64的代码,包括来自Web服务调用的整个代码。 - Arun Gupta
谢谢您的回复,Arun。我编辑了我的问题,包含了PHP代码,其中base64图像字符串被解码并在浏览器中显示。 - play2win
再次感谢您的回复。我实际上已经按照您在这里推荐的方式做了。我在Swift中将图像编码为base64字符串,然后我在Swift中对编码字符串进行了base64解码,并成功地在另一个UIImageView中显示了它。似乎在服务器上发生了某些事情,导致base64字符串或其他东西出现了损坏。目前我无法弄清楚其中的问题所在。 - play2win
是的,我能够成功从我的Android应用程序上传并在iOS中显示。我同意你的看法。似乎确实与Swift中的编码选项有关,但我不确定它适用于哪些选项。我查看了一些与编码字符串的行尾有关的选项,但我认为这些选项并不适用。目前我无法解决这个问题,还处于困境之中。 - play2win
在将图像转换为base64之前,请先尝试这个。因此,现在将图像按原样发送,而不是缩放和进行变换。 - Arun Gupta
显示剩余14条评论
3个回答

2

我能够通过对base64字符串进行百分号编码,然后将其发布到PHP服务器来使其工作。希望这能帮助其他人。


谢谢!我在这个问题上有些困难,你的帖子帮了我一把! - dijipiji

2

在play2win的自我回答之后,这里提供一些有用的Swift 3.0代码:

let data:Data = UIImagePNGRepresentation(myUIImageView.image!)!
let base64String:String = data.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0))
let imageStr:String = base64String.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!

0

你应该先将你的base64图像解码成数据并保存在服务器端,这样我们就可以得到你想要的保存位置路径的响应。 希望这能帮到你...


感谢您的回复。图像数据正在保存在MySQL数据库中。我在Swift中使用了与Android应用程序相同的步骤,而Android应用程序运行良好。首先,我获取图像,然后将图像编码为base64字符串,然后将其发送到服务器,服务器将base64字符串存储在数据库中。当我检索图像时,我从数据库中选择它,并使用PHP解码base64字符串,在浏览器中显示解码后的图像,然后由应用程序接收。但由于某种原因,Swift代码无法正常工作。 - play2win

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接