Swift 上传 Image 报错问题

Swift 上传 Image 报错问题

@(MDBook)
后台异常报错:

[mesmart] 2015-06-23 16:58:29,434 - com.opensymphony.xwork2.ognl.OgnlValueStack -2555555 [http-8080-1] WARN com.opensymphony.xwork2.ognl.OgnlValueStack - Error setting expression 'Optional(image)' with value '[Ljava.io.File;@605d9efd'
ognl.InappropriateExpressionException: Inappropriate OGNL expression: Optional(image)
at ognl.SimpleNode.setValueBody(SimpleNode.java:312)
at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
at ognl.SimpleNode.setValue(SimpleNode.java:301)
at ognl.Ognl.setValue(Ognl.java:737)

按照异常的内容是说请求页面中没有对应的参数(input 的 name)为Optional(image), 而实际上这个参数名字应该叫"image".

所以问题就出在 swift 拼接请求内容中的变量是 Optional 的. 查看 swift 中生成NSMutableURLRequest对象的地方

// 获取NSMutableURLRequest请求对象,用于提交图片等请求
func getNSMutableURLRequest(url: String, dic: NSDictionary) -> NSMutableURLRequest {
    let request =  NSMutableURLRequest(URL: NSURL(string: url)!)
    let SYMBOL:NSString?="AaB03x" //分界线的标识符 @"AaB03x"
    //上传二进制数据的数据格式如jpg、mp3
    var contentType:String!
    request.timeoutInterval = 10.0
    request.HTTPMethod = "POST"
    var bodyString=NSMutableString()
    //var dataKey: NSString? // 这里的 dataKey 是 optional 的,修改为!
    var dataKey: NSString!
    let start=NSString(format:"--\(SYMBOL)")
    let end=NSString(format:"--\(SYMBOL)--")
    var connection:NSURLConnection?
    var response:NSURLResponse?
    var error:NSError?
    var data: NSData?

    for key: AnyObject in dic.allKeys {
        var value : AnyObject!=dic[key as! NSString]
        if value.isKindOfClass(NSData){
            dataKey=NSString(format:"\(key)") // 这里的 dataKey 是 optional 的
        }else{
            bodyString.appendFormat("\(start)\r\n")
            //添加字段名称,换2行
            bodyString.appendFormat("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")// 这里的 key 是 optional 的, 需要解包改为 key! 
            //添加字段的值
            //bodyString.appendFormat("\(dic[key as! NSString])\r\n")
            //同样的,这里的 dic[key as! NSString] 是 optional 的, 需要解包改为 key! 
            bodyString.appendFormat("\(dic[key as! NSString]!)\r\n") 

        }
    }
    //添加分界线,换行
    bodyString.appendFormat("\(start)\r\n")

    //声明pic字段,文件名为boris.png
    bodyString.appendFormat("Content-Disposition: form-data; name=\"\(dataKey)\"; filename=\"\(dataKey).\(contentType)\"\r\n")

    //声明上传文件的格式
    bodyString.appendFormat("Content-Type: \(contentType)\r\n\r\n")

    //声明结束符:--AaB03x--
    var endStr=NSString(format:"\r\n\(end)")

    //声明myRequestData,用来放入http body
    var myRequestData=NSMutableData()
    //将body字符串转化为UTF8格式的二进制
    myRequestData.appendData(bodyString.dataUsingEncoding(NSUTF8StringEncoding)!)
    //将image的data加入
    myRequestData.appendData(dic[dataKey!] as! NSData);
    //加入结束符--AaB03x--
    myRequestData.appendData(endStr.dataUsingEncoding(NSUTF8StringEncoding)!);

    //设置HTTPHeader中Content-Type的值
    var  content=NSString(format:"multipart/form-data; boundary=\(SYMBOL)")
    //设置HTTPHeader
    //[request setValue:content forHTTPHeaderField:@"Content-Type"];
    request.addValue(content as String, forHTTPHeaderField:"Content-Type")
    //设置Content-Length
    request.addValue(String(myRequestData.length), forHTTPHeaderField:"Content-Length")

    request.HTTPBody=myRequestData

    return request
}

修改后解决

2015-06-28 15:091