将音频从Swift应用程序发送到PHP服务器,并且音频丢失
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了将音频从Swift应用程序发送到PHP服务器,并且音频丢失,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4713字,纯文字阅读大概需要7分钟。
内容图文
![将音频从Swift应用程序发送到PHP服务器,并且音频丢失](/upload/InfoBanner/zyjiaocheng/661/8f6376cf6a28462ea395eb452b929a99.jpg)
我正在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()
应该接收记录的文件catch.php中的PHP代码:
$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 "file=@Untitled.m4a"
内容总结
以上是互联网集市为您收集整理的将音频从Swift应用程序发送到PHP服务器,并且音频丢失全部内容,希望文章能够帮你解决将音频从Swift应用程序发送到PHP服务器,并且音频丢失所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。