无法从服务器响应下载附件

时间:2015-01-17 05:03:27

标签: ios swift client-server httpresponse alamofire

我在Alamofire中使用post方法成功上传文件,我从服务器获得响应,我可以看到附件隐藏在响应中。当我试图在计算机中保存附件时,它不起作用。这是代码:

let urlRequest = urlRequestWithComponents(URL, parameters: parameters, imageData: fileData!)
Alamofire.upload(urlRequest.0, urlRequest.1)
    .progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in
        println("\(totalBytesWritten) / \(totalBytesExpectedToWrite)")
    }
    .response { (request, response, data, error) in
        println("REQUEST \(request)")
        println("RESPONSE \(response)")
        println("JSON \(data)")
        println("ERROR \(error)")

以下是我从服务器获得的附件中的文件:

"Content-Disposition" = "attachment; filename=20150113171557120001.mid";

数据显示正确的.mid文件

  

JSON可选(小于4d546864 00000006 00000001 00044d54 726b0000 00540391 35350381 35350291 3a3a0281 3a3a0291 3c3c0381 3c3c0191 3e3e0381 3e3e0691 3e3e0381 3e3e0891 3e3e0381 3e3e0291 3c3c0381 3c3c0191 3d3d0381 3d3d0191 3a3a0381 3a3a0691 3a3a0381 3a3a00ff 2F00&GT)

     

ERROR nil

以下是我用来在计算机中保存附件的代码:

let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSArray
let documentsDirectory = paths.objectAtIndex(0) as NSString
let path = documentsDirectory.stringByAppendingPathComponent("file.mid")
 (data as NSData).writeToFile(path, atomically:true)

在我添加保存附件的代码后,没有错误或警告,在输出时除了显示如下的线程:

  

thread1 exc_breakpoint(code = exc_i386_BPT,subcode = 0x0)

我使用错误的方法保存附件吗?

2 个答案:

答案 0 :(得分:1)

查看你的十六进制表示,它看起来像一个MIDI文件(它以正确的字节开头)。

问题是:

let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSArray
let documentsDirectory = paths.objectAtIndex(0) as NSString

您正在获得"第一项"两次。您尝试作为paths返回的项目不是路径数组,而是该数组中的第一个字符串(因为您在末尾包含了[0])。因此,将其作为数组转换的尝试将失败(更不用说稍后从中获取第一个项目的尝试)。

更简单的是:

let documentsDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String

答案 1 :(得分:0)

您可以使用网址而不是路径

let documentsUrl =  NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first as NSURL
let fileUrl = documentsUrl.URLByAppendingPathComponent("file.mid")
data.writeToURL(fileUrl, atomically:true)