我正在Swift中制作一个应用程序,该应用程序记录一些音频,然后将该记录发送到我的PHP服务器.
该应用程序会很好地录制音频剪辑(可以正常播放).当我打印记录的音频剪辑时,它会显示负载和字节数据负载(与将音频放入NSData包装器时相同).这一切都向我表明,应用程序内部的音频效果很好.
在我的服务器上捕获记录的PHP文件也可以正常工作,并且没有错误.
但是沿线某处录制的音频剪辑丢失了.
上载记录的Swift代码:
// The variable "recordedFileURL" is defined earlier in the code like this:
currentFilename = "xxxx.m4a"
let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
let docsDir: AnyObject=dirPaths[0]
recordedFilePath = docsDir.stringByAppendingPathComponent(self.currentFilename)
recordedFileURL = NSURL(fileURLWithPath: self.recordedFilePath)
// "currentFilename", "recordedFilePath" and "recordedFileURL" are all global variables
// This recording stored at "recordedFileURL" can be played back fine.
let sendToPath = "http://......../catch.PHP"
let sendToURL = NSURL(string: sendToPath)
let recording: NSData? = NSData(contentsOfURL: recordedFileURL)
let boundary = "--------14737809831466499882746641449----"
let contentType = "multipart/form-data;boundary=\(boundary)"
var request = NSMutableuRLRequest()
request.URL = sendToURL
request.HTTPMethod = "POST"
request.addValue(contentType, forHTTPHeaderField: "Content-Type")
request.addValue(recId, forHTTPHeaderField: "REC-ID") // recId is defined elsewhere
var body = NSMutableData()
var header = "Content-disposition: form-data; name=\"\(currentFilename)\"; filename=\"\(recordedFilePath)\"\r\n"
body.appendData(("\r\n-\(boundary)\r\n" as Nsstring).dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData((header as Nsstring).dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData(("Content-Type: application/octet-stream\r\n\r\n" as Nsstring).dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData(recording!) // adding the recording here
body.appendData(("\r\n-\(boundary)\r\n" as Nsstring).dataUsingEncoding(NSUTF8StringEncoding)!)
request.HTTPBody = body
var session = NSURLSession.sharedSession()
var task = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in
println("upload complete")
let dataStr = Nsstring(data: data, encoding: NSUTF8StringEncoding)
println(dataStr)
})
task.resume()
$contents = file_get_contents('PHP://input');
$files = $_FILES;
echo "Caught the following:/r/n";
echo "Contents:" . var_export($contents) . "/r/n";
echo "Files:" . var_export($files) . "/r/n";
每当我运行所有这些命令时,我都会从catch.PHP获得以下输出:
Caught the following:
Contents:''
Files:array (
)
因此catch.PHP根本不接收任何东西.
提前致谢.
解决方法:
您的PHP代码基本上没问题. $_FILES部分可以,但是php://input
is not available with enctype="multipart/form-data"
.
问题在于您如何在Swift代码中生成HTTP请求.主要是HTTP标头.
当为多部分数据创建标题时,模式是这样的(如果我们选择AAAAA作为边界):
>我们选择的边界:“ AAAAA”
>内容类型=“多部分/表单数据;边界= AAAAA”
>开始赏金= –AAAAA
>结束边界= –AAAAA–
// This was your main problem
let boundary = "--------14737809831466499882746641449----"
let beginningBoundary = "--\(boundary)"
let endingBoundary = "--\(boundary)--"
let contentType = "multipart/form-data;boundary=\(boundary)"
// recordedFilePath is Optional, so the resulting string will end up being 'Optional("/path/to/file/filename.m4a")', which is wrong.
// We Could just use currentFilename if we wanted
let filename = recordedFilePath ?? currentFilename
var header = "Content-disposition: form-data; name=\"\(currentFilename)\"; filename=\"\(recordedFilePath!)\"\r\n"
var body = NSMutableData()
body.appendData(("\(beginningBoundary)\r\n" as Nsstring).dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData((header as Nsstring).dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData(("Content-Type: application/octet-stream\r\n\r\n" as Nsstring).dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData(recording!) // adding the recording here
body.appendData(("\r\n\(endingBoundary)\r\n" as Nsstring).dataUsingEncoding(NSUTF8StringEncoding)!)
var request = NSMutableuRLRequest()
request.URL = sendToURL
request.HTTPMethod = "POST"
request.addValue(contentType, forHTTPHeaderField: "Content-Type")
request.addValue(recId, forHTTPHeaderField: "REC-ID") // recId is defined elsewhere
request.HTTPBody = body
如果再次遇到这种情况,在调试此类网络代码时,我喜欢使用可让我检查正在传输的HTTP网络数据的工具.我个人喜欢HTTPScoop,因为它很简单,但是您也可以使用BurpSuite或Charles
我只是运行您的代码,并将HTTP流量与我使用curl发出请求时发生的情况进行了比较
curl -X POST http://localhost/\~cjwirth/catch.PHP -F "[email protected]"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。