如何使用POST上传文件附件?

时间:2015-06-05 23:20:11

标签: swift salesforce

我已创建了一个音频文件,我想附加到"订单" Salesforce中的对象。该文件的路径位于theSoundPath

以下代码会导致错误显示为:'NSInvalidArgumentException', reason: 'Invalid type in JSON write (NSConcreteData)'

我根据API的要求在base64中编码文件。但我也在想这是什么引发了这个错误。如果有人能指出我正确的方向,我将不胜感激。

以下是相关代码(使用SwiftyJSON和Alamofire):

    let encodedSound = NSFileManager.defaultManager().contentsAtPath(self.theSoundPath)
    let encodedBase64Sound = encodedSound!.base64EncodedDataWithOptions(nil)
    let tokenParam = "Bearer " + theToken // Bearer prefix required by API
    let theWriteURL = theInstance + "/services/data/v33.0/sobjects/Order/" + self.theOrder + "/Attachment/"
    let URL = NSURL(string: theWriteURL)!
    let mutableURLRequest = NSMutableURLRequest(URL: URL)
    mutableURLRequest.HTTPMethod = "POST"

    let parameters = [
        "AccountId": "001xxxxxxxxxxxx",
        "Name": "testfile.aac",
        "Body": encodedBase64Sound
    ]

    var JSONSerializationError: NSError? = nil
    mutableURLRequest.HTTPBody = NSJSONSerialization.dataWithJSONObject(parameters, options: nil, error: &JSONSerializationError)
    mutableURLRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
    mutableURLRequest.setValue(tokenParam, forHTTPHeaderField: "Authorization")

    Alamofire.request(mutableURLRequest)
        .responseJSON { (req, res, json, error) in // . . . etc.

1 个答案:

答案 0 :(得分:2)

来自NSJSONSerialization's doc

  

可以转换为JSON的对象必须具有以下内容   属性:

     
      
  • 顶级对象是NSArray或NSDictionary。

  •   
  • 所有对象都是NSString,NSNumber,NSArray的实例,   NSDictionary,或NSNull。

  •   
  • 所有字典键都是NSString的实例。

  •   
  • 数字不是NaN或无穷大。

  •   

但您尝试序列化NSData对象,即

的结果
encodedBase64Sound = encodedSound!.base64EncodedDataWithOptions(nil)

而是创建一个base64字符串

encodedBase64Sound = encodedSound!.base64EncodedStringWithOptions(nil)