当前位置: 首页 > 知识库问答 >
问题:

无法使用Alamofire在Swift 3中上传图像

伯丁雷
2023-03-14

我在试图让Alamofire上传图像时被困了三天。其想法是,Alamofire将使用一些php代码将其发送到服务器。在不同的地方进行了大量的尝试和研究之后,一些代码应该可以工作,但是Alamofire的服务器端文档非常糟糕。

Swift 3最近的更新对明智的回答没有多大帮助...

这是我的Swift 3代码:

let imageData = UIImageJPEGRepresentation(imageFile!, 1)!

Alamofire.upload(
        multipartFormData: { multipartFormData in
            multipartFormData.append(imageData, withName: "image", fileName: "image.jpeg", mimeType: "file/jpeg")
        },
        to: "https://someadress.com/post/upload.php",
        encodingCompletion: { encodingResult in
            switch encodingResult {
            case .success(let upload, _, _):
                upload.responseJSON { response in
                    debugPrint(response)
                }
            case .failure(let encodingError):
                print(encodingError)
            }
        }
    )

这应该上传到服务器上的图像,但我不知道如何正确地将图像保存在服务器上。服务器实际上不需要该文件的任何信息,因为它将为该文件生成一个新名称。然后,它应该将该名称发送回应用程序。

我知道如何在Swift 3和PHP中处理JSON,因为我以前做过。我也确定至少有一些东西被上传到服务器,因为我已经得到了一些基本信息。

下面的PHP代码几乎肯定不好,但它主要是一个测试

<?php
// get the file data
$fileData = file_get_contents('php://input');

// sanitize filename
$fileName = preg_replace("([^\w\s\d\-_~,;:\[\]\(\).])", '', $fileData);
// save to disk

$fileLocation = "../images/" . $fileName;
file_put_contents($fileLocation, $fileData);

if (empty($fileData)) {
    $response = array("error" => "no data");
}
else {
    $response = array("error" => "ok " . $fileName);
}

echo json_encode($response);
?>

提前感谢任何帮助:)

P. S.我是新来的,所以请温柔点;)

共有2个答案

公良子轩
2023-03-14

雨燕3

 func uploadImage(_ imageFileUrl:URL, encodeCompletion: ((Alamofire.SessionManager.MultipartFormDataEncodingResult) -> Void)?){
     let fileName = "imageName.jpg"
     let headers = ["contentType":"image/jpeg"]
        Alamofire.upload(multipartFormData: { (multipartFormData) in
            multipartFormData.append(imageFileUrl, withName: fileName)
        }, to: "uploadPath", method: .post, headers: headers, encodingCompletion: encodeCompletion)
    }
卜方伟
2023-03-14

好的,所以。我想通了。原来Alamofire使用的是php的$_FILES函数。没有提到这一点,所以让我来试着把事情搞清楚。下面是带注释的完整PHP代码。

<?php

// If the name of the image is not in this array, the app didn't post anything.
if (empty($_FILES["image"])) {
    // So we send a message back saying there is no data...
    $response = array("error" => "nodata");
}
// If there is data
else {
    $response['error'] = "NULL";
    // Setup a filename for the file. Uniqid can be changed to anything, but this makes sure
    // that every file doesn't overwrite anything existing.
    $filename = uniqid() . ".jpg";
    // If the server can move the temporary uploaded file to the server
    if (move_uploaded_file($_FILES['image']['tmp_name'], "../images/" . $filename)) {
        // Send a message back saying everything worked!
        // I also send back a link to the file, and the name.
        $response['status'] = "success";
        $response['filepath'] = "[APILINK]/images/" . $filename;
        $response['filename'] = "".$_FILES["file"]["name"];

} else{
    // If it can't do that, Send back a failure message, and everything there is / should be form the message
    // Here you can also see how to reach induvidual data from the image, such as the name.
    $response['status'] = "Failure";
    $response['error']  = "".$_FILES["image"]["error"];
    $response['name']   = "".$_FILES["image"]["name"]; 
    $response['path']   = "".$_FILES["image"]["tmp_name"];
    $response['type']   = "".$_FILES["image"]["type"];
    $response['size']   = "".$_FILES["image"]["size"];
  }
}

// Encode all the responses, and echo them.
// This way Alamofire gets everything it needs to know
echo json_encode($response);
?>

基本上就是这样。您所要做的就是确保与Alamofire请求一起发送的名称与“$\u文件”括号中的名称匹配。临时名称是Alamofire中文件的名称。

这是Swift 3代码。

// Note that the image needs to be converted to imagedata, in order to work with Alamofire.
let imageData = UIImageJPEGRepresentation(imageFile!, 0.5)!

Alamofire.upload(
            multipartFormData: { multipartFormData in
                // Here is where things would change for you
                // With name is the thing between the $files, and filename is the temp name.
                // Make sure mimeType is the same as the type of imagedata you made!
                multipartFormData.append(imageData, withName: "image", fileName: "image.jpg", mimeType: "image/jpeg")
            },
            to: "[APILINK]/post/upload.php",
            encodingCompletion: { encodingResult in
                switch encodingResult {
                case .success(let upload, _, _):
                    upload.responseJSON { response in
                        if let result = response.result.value {
                            // Get the json response. From this, we can get all things we send back to the app.
                            let JSON = result as! NSDictionary
                            self.imageServerLocation = JSON.object(forKey: "filepath") as? String
                            debugPrint(response)
                        }
                    }
                case .failure(let encodingError):
                    print(encodingError)
                }
            }
        )

我希望这能帮助很多有同样问题的人!如果有什么遗漏或你想知道的,请告诉我!

 类似资料:
  • 我正试图用Alamofire将图像上传到服务器,但我的代码不起作用。这是我的代码: 这是urlRequestWithComponents方法: 这就是我在控制台得到的: 请求{URL:http://tranthanhphongcntt.esy.es/task_manager/IOSFileUpload/ }响应可选({URL:http://tranthanhphongcntt.esy.es/tas

  • 我正在用Swift开发一个iPhone应用程序。我正在使用Alamofire框架来处理http请求。我将用于POST,GET等,如下所示: 我使用将图像上载到服务器: 谁能帮我解决这个问题? 谢谢!:)

  • 问题内容: 我正在使用以下代码将单个图像上传到服务器: 如何通过编辑此代码在单个参数中上传多张图片? 问题答案: Swift 3 只需在图像上传参数中使用“ []”即可使其成为图像数组。

  • 我正在使用Alamofire向服务器发送数据。我有一个图像,我想上传到服务器的数据形式与一些其他参数。在Alamofire中,我使用multipartFormData方法发布所有参数和图像。服务器需要数据为JSON格式,参数如下所示: 我正在努力,但它给了我一个失败的回应。以下是我在swift中与alamofire合作的代码: 我的服务器接受BLOB数据中的映像。如果有人能帮我。非常感谢。

  • 我试图上传图像与多个参数使用阿拉莫菲尔多部分与swift 4,但我不能上传图像成功,我得到的回应如下 这是我在上传按钮事件中调用的函数。 当我转换图像使用UIImagePNG表示与相同的方法只是改变一行 MultipartFormData.append(ImageData!,带名称:图像,文件名:image.png,mimeType:图像/png) 它会给我这样的感觉 请帮帮我!!

  • 问题内容: 我发现用AJAX上传图像似乎不符合表单中指定的multipart,因为我检查它是否为multipart()的代码从不起作用(在Java中)。 我有这个HTML表单: 以下是我的Ajax代码,该代码将图像发送到地址处的上传处理程序。我的Java代码中的uploadPost()方法首先确定上传是否为多部分,但是,似乎ajax不会将图像作为多部分发送。是否因为我在表单上使用了jQuery的s