我有一个应用程序,用户从照片库中选择5个图像,然后我发送将这5个UIImages发送到nodejs服务器并将它们存储在mysql数据库中,但是当我从中获取数据时,我遇到了很多问题。数据库并尝试转换回uiimage,这里也有很多人说它更好地存储图像网址或数据库中的图像路径而不是实际图像,所以我决定尝试这种方法,但我不知道如何获取图片网址?或者如何获得图像的路径?我的应用程序仍然需要从iOS设备发送图像到nodejs服务器,存储实际图像,并检索图像,以便其他用户可以看到它,但我在哪里以及如何存储图像?
更新:所以我的问题是我从swift中的UIImage开始,将其转换为base64字符串表示,发送到nodejs服务器,并将其插入到mysql数据库中,但是当我将mys64表中的base64字符串表示发送回ios设备我得到一个错误,试图将字符串转换回uiimage,我将字符串转换回Data对象,然后尝试从该数据对象创建一个uiimage,但uiimage总是为零,我没有得到错误说明来自xcode所以我不知道该如何去做?
func sendToNodeServer()
{
let url: URL = URL(string: "http://localhost:8081/testInsert")!
let session = URLSession.shared
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData
let imageData:NSData = UIImagePNGRepresentation(imV.image!)! as NSData
let strBase64:String = imageData.base64EncodedString(options: .lineLength64Characters)
let paramString = "pic=" + strBase64
request.httpBody = paramString.data(using: String.Encoding.utf8)
let task = session.dataTask(with: request)
{ data, response, error in
if error != nil
{
print("error in web request")
}
else
{
}
}//completion handler end
task.resume() //start the web reuqest
}
func getFromNodeServer()
{
let url: URL = URL(string: "http://localhost:8081/testgrab")!
let session = URLSession.shared
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData
let task = session.dataTask(with: request)
{ data, response, error in
if error != nil
{
print("error in web request")
}
else
{
DispatchQueue.main.async
{
self.parseWeb2(stuff: data) //stoer results in class member
}
}
}//completion handler end
task.resume() //start the web reuqest
}
func parseWeb2(stuff: Data?)
{
if stuff != nil
{
if let dataAsAny: NSArray = try? JSONSerialization.jsonObject(with: stuff!, options: .mutableContainers) as! NSArray
{
let dic: [String: AnyObject] = dataAsAny[0] as! [String: AnyObject]
let str: String = dic["value"] as! String
let data: NSData = NSData(base64Encoded: str, options: NSData.Base64DecodingOptions.ignoreUnknownCharacters)!
//ERROR, UIImage is always nil
let p: UIImage = UIImage(data: data as Data)!
imV.image = p
}
}
}
//nodejs code
//import modules
var path = require("path");
var bodyParser = require('body-parser');
var express = require('express');
var mysql = require("mysql");
var fs = require('fs');
var app = express();
app.use(bodyParser.json({limit: "50mb"}));
app.use(bodyParser.urlencoded({limit: "50mb", extended: true, parameterLimit:50000}));
var con = mysql.createConnection(
{ /*my credentials*/ } );
app.post('/testInsert', function (req, res)
{
var queryString = "Insert into Test(value) VALUES ( ? );";
con.query(queryString,[req.body.pic],function(err,rows)
{
if(err) throw err;
});//CON.QUERY end
});
app.post('/testgrab', function (req, res)
{
var queryString = "select test.value from test where id = 3;";
con.query(queryString,function(err,rows)
{
if(err) throw err;
res.send(rows);
});//CON.QUERY end
});
//mysql has 1 table called test with 2 colums (id,value) of type (int, medium text)
答案 0 :(得分:-1)
我解决了我的问题,问题是base 64字符串包含字符+ / =在URL编码中是不允许的,因此我必须将我的base 64字符串转换为正确的url编码格式然后我上传字符串并且可以正确地检索它,以url编码字符串i为+ = / chars
添加百分比转义