【发布时间】:2020-09-08 15:52:47
【问题描述】:
我正在使用 Swift 4 开发 iOS 应用程序。
我需要将应用程序中的图像上传到服务器上,以便稍后将其保存到数据库中。我为此寻找解决方案;首先我使用base64Encoding,图像转换为String并存储在数据库中,然后当我想上传这个图像时,我使用base64解码,但是,我得到一个黑色的image。
所以,我尝试使用此代码将图像上传到服务器:
class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
@IBOutlet var image: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func selectPicture(_ sender: AnyObject) {
let ImagePicker = UIImagePickerController()
ImagePicker.delegate = self
ImagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary
self.present(ImagePicker, animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
image.image = info[UIImagePickerControllerOriginalImage] as? UIImage
self.dismiss(animated: true, completion: nil)
}
@IBAction func upload_request(_ sender: AnyObject) {
UploadRequest()
}
func UploadRequest()
{
let url = URL(string: "http://192.168.101.13/upload.php")
let request = NSMutableURLRequest(url: url!)
request.httpMethod = "POST"
let boundary = generateBoundaryString()
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
if (image.image == nil)
{
return
}
let image_data = UIImagePNGRepresentation(image.image!)
if(image_data == nil)
{
return
}
let body = NSMutableData()
let fname = "test.png"
let mimetype = "image/png"
body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
body.append("Content-Disposition:form-data; name=\"test\"\r\n\r\n".data(using: String.Encoding.utf8)!)
body.append("hi\r\n".data(using: String.Encoding.utf8)!)
body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
body.append("Content-Disposition:form-data; name=\"file\"; filename=\"\(fname)\"\r\n".data(using: String.Encoding.utf8)!)
body.append("Content-Type: \(mimetype)\r\n\r\n".data(using: String.Encoding.utf8)!)
body.append(image_data!)
body.append("\r\n".data(using: String.Encoding.utf8)!)
body.append("--\(boundary)--\r\n".data(using: String.Encoding.utf8)!)
request.httpBody = body as Data
let session = URLSession.shared
let task = session.dataTask(with: request as URLRequest, completionHandler: {
(
data, response, error) in
guard ((data) != nil), let _:URLResponse = response, error == nil else {
print("error")
return
}
if let dataString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
{
print(dataString)
}
})
task.resume()
}
func generateBoundaryString() -> String
{
return "Boundary-\(UUID().uuidString)"
}
}
和php代码:
if (move_uploaded_file($_FILES['file']['tmp_name'], "image.png")) {
echo "File uploaded: ".$_FILES["file"]["name"];}
但是我收到了这些警告,并且图片没有上传到服务器上:
move_uploaded_file(image.png): failed to open stream: Permission denied in /Applications/XAMPP/xamppfiles/htdocs/upload.php
move_uploaded_file(): Unable to move '/Applications/XAMPP/xamppfiles/temp/phprJ2M6j' to 'image.png' in /Applications/XAMPP/xamppfiles/htdocs/upload.php
如何在服务器上成功上传图片。
【问题讨论】:
-
你说“图片没有上传到服务器”。这是否意味着文件
/Applications/XAMPP/xamppfiles/temp/phprJ2M6不存在? -
是的,我就是这个意思。
-
目录是否存在?你有权限写吗?
-
是的,目录存在。我用chmod 777更改权限
-
好吧,你发布的这句话让我觉得很奇怪:无法将 '/Applications/XAMPP/xamppfiles/temp/phprJ2M6j' 移动到 'image.png' - 不应该反过来?无法将“image.png”移动到 /YourDirectory?检查处理文件上传的 PHP 文件,并确保您没有尝试将文件位置保存到图像中。