Swift Alamofire 在变量中上传图像 rails API

Swift Alamofire upload image in variable for rails API

所以这是我的问题,我必须将 swift 应用程序中的图像上传到使用 rails 的服务器。我几乎设置了所有内容,除了 rails api 必须在变量 document[:file]

中接收文件数据

这是我使用 alamofire 对图像进行编码的函数:

static func getDocumentCreateUploadData(parameters: [String : AnyObject], imageData: NSData) -> (uploadData:NSMutableData, contentType:String) {
    let boundaryConstant = "NET-POST-boundary-\(arc4random())-\(arc4random())";
    let contentType = "multipart/form-data;boundary="+boundaryConstant

    let uploadData = NSMutableData()

    // add image
    uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
    uploadData.appendData("Content-Disposition: form-data; name=\"file\"; filename=\"file.png\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
    uploadData.appendData("Content-Type: image/png\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
    uploadData.appendData(imageData)

    // add parameters
    for (key, value) in parameters {
        uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        uploadData.appendData("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)".dataUsingEncoding(NSUTF8StringEncoding)!)
    }
    uploadData.appendData("\r\n--\(boundaryConstant)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)

    return (uploadData, contentType)
}

然后我用

调用我的api
var imageParameters = [
     "documents": [
          "documentable_type": "Profile",
          "documentable_id": user.profile.id!
     ]
]
let data = Router.getDocumentCreateUploadData(imageParameters, imageData: imageData)
let urlRequest = Router.CreateDocument(contentType: data.contentType)
Alamofire.upload(urlRequest, data.uploadData).validate().responseSwiftyJSON({ (request, response, json, error) in
    if error != nil {
       ...

我想知道的是如何对图像进行编码以使其符合 api 规范。

{
    "documents" : {
        "file": the_file,
        "documentable_type": the_documentable_type,
        "documentable_id": the_documentable_id
    }
}

有办法实现吗?

提前致谢。

我只是误解了 api,我在上传调用中不需要根文档

我需要做的就是删除文档根目录,但我是这样做的:

    let imageParameters = [
        "documentable_type": "Comment",
        "organization_id": organizationId,
        "member_id": memberId,
        "user_id": user.id
    ]

    let uuid = NSUUID().UUIDString

    composeBarView.enabled = false
    ProgressHUDManager.uploadingStatus()

    Alamofire.upload(
        Router.CreateDocument,
        multipartFormData: { multipartFormData in
            multipartFormData.appendBodyPart(data: imageData!, name: "file", fileName: "\(uuid).jpg", mimeType: "image/jpeg")
            for (key, value) in imageParameters {
                multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key)
            }
        },
        encodingCompletion: { encodingResult in
            // Handle result
        }
    )

API 进化所以代码是新的但我希望它能帮助