【问题标题】:Converting Image Data into Base64 String For MySQL Blob and Decoding it Back将图像数据转换为 MySQL Blob 的 Base64 字符串并将其解码回来
【发布时间】:2018-08-05 21:01:27
【问题描述】:

我正在尝试将数据(名字、姓氏、年龄、图像)发送到 MySQL 数据库。我可以。以下是我所拥有的。

class PostViewController: UIViewController {
    @IBAction func selectTapped(_ sender: UIButton) {
        postData()
    }

    func postData() {
        var request = URLRequest(url: URL(string: "http://www.mywebsite.tv/post.php")!)
        request.httpMethod = "POST"
        let fName = firstField.text!
        let lName = lastField.text!
        let ageStr = ageField.text!
        let image = imageView.image!
        guard let pictStr = convertImageBase64(image: image) else {
            return
        }
        let postString = "a=\(fName)&b=\(lName)&c=\(ageStr)&d=\(pictStr)"
        request.httpBody = postString.data(using: .utf8)
        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            guard let data = data, error == nil else {
                print("error=\(String(describing: error))")
                return
            }

            if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
                print("statusCode should be 200, but is \(httpStatus.statusCode)")
                print("response = \(String(describing: response))")
            }

            let responseString = String(data: data, encoding: .utf8)
            print("responseString = \(String(describing: responseString))")
        }
        task.resume()
    }

    func convertImageBase64(image: UIImage) -> String? {
        guard let pictData = UIImagePNGRepresentation(image) else {
            return nil
        }
        let strBase64: String = pictData.base64EncodedString(options: Data.Base64EncodingOptions.lineLength64Characters)
        return strBase64
    }
}

并用来自 MySQL 的数据填充 UITableView..

class HomeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, DataModelProtocol {
    // MARK: - Variables
    var myItems = NSArray()

    // MARK: - IBOutlets
    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // somehow loading data //    
    }

    // MARK: - TableView
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return myItems.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! ProfileTableViewCell
        let item: PictureModel = myItems[indexPath.row] as! PictureModel
        cell.firstLabel.text = item.fName
        cell.lastLabel.text = item.lName
        cell.ageLabel.text = item.ageStr
        print(item.pictStr!) // returning iVBORw0KGgoAAAANSUh...
        if let img = convertBase64Image(base64String: item.pictStr!) {
            cell.pictureImageView.image = img
        }
        return cell
    }

    func convertBase64Image(base64String: String) -> UIImage? {
        if let pictData = Data(base64Encoded: base64String, options: Data.Base64DecodingOptions.ignoreUnknownCharacters) {
            return UIImage(data: pictData)
        } else {
            return nil
        }
    }
}

事情是cell.pictureImageView.image 总是零。我现在知道为什么了。当我发布图片时,一个示例 base64 字符串是

iVBORw0KGgoAAAANSUhEUgAAAFYAAACACAYAAACRMZ7FAAAAAXNSR0IArs4c6QAA\r\nABxp...

我得到的解码字符串是

iVBORw0KGgoAAAANSUhEUgAAAFYAAACACAYAAACRMZ7FAAAAAXNSR0IArs4c6QAA ABxp...

所以Data.Base64DecodingOptions.ignoreUnknownCharacters 选项实际上将 \r\n 替换为空格。如何对图像进行编码,然后将其解码回来?

【问题讨论】:

  • 你为什么要.lineLength64Characters?我会简单地删除它,你应该很高兴。
  • @luk2302 的评论应该是答案。
  • @luk2302 我对 Base64 一无所知,这就是我前几天需要将图像编码为 Base64 以用于 Firebase 数据库的情况。如何更改 convertImageBase64 函数?谢谢。
  • 你为什么要对二进制数据进行base64编码,然后存储在BLOB列中?只需存储原始二进制文件。
  • @ElTomato:您可能想阅读this answer

标签: ios mysql swift base64 urlsession


【解决方案1】:

删除.lineLength64Characters 选项:

func convertImageBase64(image: UIImage) -> String? {
    guard let pictData = UIImagePNGRepresentation(image) else {
        return nil
    }
    let strBase64: String = pictData.base64EncodedString(options: [])
    return strBase64
}

这样一来字符串中就不会包含\r\n

【讨论】:

  • 我明白了。不是零,而是 []。我试试看。
  • 谢谢。不过,我没有恢复我的形象。当然,这不是错。
  • @ElTomato 等一下,我“改”错了函数,请重新检查,你应该改convertImageBase64方法,其他方法应该没问题。
猜你喜欢
  • 2021-08-18
  • 2021-02-01
  • 2015-04-22
  • 1970-01-01
  • 2018-09-07
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多