ios 从服务器获取文件,ios - 如何将远程文件(从远程SMB服务器获取)提供给某些请求 - 堆栈内存溢出...

当某些请求命中服务器(在移动应用程序上运行的服务器)时,我正在尝试将视频文件作为响应提供。

该视频文件可以存储在本地,也可以是外部存储的。 我开始尝试提供位于SMB服务器上的文件,所以我尝试使用此代码从服务器获取文件并返回它(我知道它正在等待整个文件读取而不是读取和发送块,但应该工作对?):

webServer.addDefaultHandlerForMethod("GET", requestClass: GCDWebServerRequest.self, processBlock: {request in

print("########\n########Request: \(request)")

let webrequested:GCDWebServerRequest = request;

let urlcita:String = String(webrequested.URL)

print("URL of requests\(urlcita)")

if urlcita.rangeOfString("videosmb") != nil{

print("It's a video SMB request")

//Test fake SMB file predefined. Read File using KxSMB

let route:String = "smb://192.168.1.205/ServidorAH/video.avi";

let extensFile:NSString = (route as NSString).pathExtension

let contentype = GCDWebServerGetMimeTypeForExtension(extensFile as String);

print("Content type MIME \(contentype)")

//Open SMB file using KxSMB

let authcredentials = KxSMBAuth.smbAuthWorkgroup("", username: "Guest", password: "");

let provider = KxSMBProvider.sharedSmbProvider()!

let archivoes = provider.fetchAtPath(route, auth: authcredentials)

//Switch to manually end the reading when switched to true. In the future will send chunks of data until the end, instead of reading the whole file first.

var interruptor:Bool = false

//Response Stream block

let responseStream: GCDWebServerStreamedResponse = GCDWebServerStreamedResponse(contentType: contentype, asyncStreamBlock: { completionBlock in

if (interruptor == true)

{

print("Test: End of reading")

completionBlock(NSData(), nil);

}

if archivoes!.isKindOfClass(NSError){

//It can not find the file, SMB error, so empty NSDATA to completion block

let errorcito:NSError = archivoes as! NSError

print("Error obteniendo archivo SMB: \(errorcito.localizedDescription)");

completionBlock(NSData(), nil);

}else{

print("Archivo SMB adecuado \(archivoes)")

let datos:NSData = archivoes!.readDataToEndOfFile()

//Print lenght of data (to check the size of the file)

print("Data lenght \(datos.length)")

//Set switch to true, so the next call will send an empty daya completion block

interruptor = true

//Send data chunk (in this case everything)

completionBlock(datos, nil);

}

})

return responseStream

}else{

//Default response

return GCDWebServerDataResponse(HTML:"

Hello World

")

}

但是,我无法使其发挥作用。 我总是得到一个损坏的管道错误,访问网络服务器的网络播放器(从mac和iOS浏览)也没有播放任何东西。 我也尝试使用嵌入式iOS播放器来记录响应(KxMovie)。 我得到这样的东西:

[DEBUG] Did open connection on socket 19

[DEBUG] Connection received 177 bytes on socket 19

[DEBUG] Connection on socket 19 preflighting request "GET /videosmb" with 177 bytes body

[DEBUG] Connection on socket 19 processing request "GET /videosmb" with 177 bytes body

[DEBUG] Did connect

[DEBUG] Did start background task

[DEBUG] Connection sent 175 bytes on socket 19

...

使用应用程序内部的本地播放器(KxMovie),此处似乎正在读取文件标题,并获得正确的文件大小和视频尺寸。 然而它没有播放,它结束说它到达了视频的结尾(没有播放)。 就在此之后,WebServer显示错误:

...

[ERROR] Error while writing to socket 19: Broken pipe (32)

[DEBUG] Did close connection on socket 19

[VERBOSE] [fe80::cd0:28cd:3a37:b871%en1:8080] fe80::cd0:28cd:3a37:b871%en1:50109 200 "GET /videosmb" (177 | 175)

[DEBUG] Did disconnect

[DEBUG] Did end background task

鉴于这是我第一次处理SMB服务器这一事实,我可能认为SMB部分出了问题,所以我决定采用简化的方法进行测试。 这次我尝试提供存储在远程网络服务器(不是SMB)上的简单mp4文件。 它也没用。 最后,我尝试提供应用程序主Bundle中包含的本地文件,同样的事情发生了:没有。 这是代码:

webServer.addDefaultHandlerForMethod("GET", requestClass: GCDWebServerRequest.self, processBlock: {request in

print("########\n########Request: \(request)")

let webrequested:GCDWebServerRequest = request;

let url:String = String(webrequested.URL)

print("URL of request: \(url)")

if url.rangeOfString("video") != nil{

print("It's a video request")

let rutalocalita = (NSBundle.mainBundle()).pathForResource("video", ofType: "avi")

let datos = NSData(contentsOfFile: rutalocalita!)!

print("video size: \(datos.length)")

return GCDWebServerDataResponse(data: datos, contentType: "video/avi")

}else{

//Default Response: Simple web

return GCDWebServerDataResponse(HTML:"

Hello World

")

}

})

这就是日志的样子:

[DEBUG] Did open connection on socket 19

[DEBUG] Connection received 177 bytes on socket 19

[DEBUG] Connection on socket 19 preflighting request "GET /video" with 177 bytes body

[DEBUG] Connection on socket 19 processing request "GET /video" with 177 bytes body

[DEBUG] Did connect

[DEBUG] Did start background task

[myCUSTOMDebug] Read 13584902 b. I'm going to send the response back to the request.

[DEBUG] Connection sent 173 bytes on socket 19

...

这里的本地播放我在应用程序内部使用跟踪响应,能够读取如下内容:

header='HTTP/1.1 200 OK'

2015-10-17 17:51:41.571 videotvtest[262:14252] http_code=200

2015-10-17 17:51:41.571 videotvtest[262:14252] header='Cache-Control: no-cache'

2015-10-17 17:51:41.571 videotvtest[262:14252] header='Content-Length: 13584902'

2015-10-17 17:51:41.572 videotvtest[262:14252] header='Content-Type: video/avi'

2015-10-17 17:51:41.572 videotvtest[262:14252] header='Connection: Close'

2015-10-17 17:51:41.573 videotvtest[262:14252] header='Server: GCDWebServer'

...

[ERROR] Error while writing to socket 19: Broken pipe (32)

[DEBUG] Did close connection on socket 19

[VERBOSE] [fe80::cd0:28cd:3a37:b871%en1:8080] fe80::cd0:28cd:3a37:b871%en1:50155 200 "GET /video" (177 | 173)

netbios_ns_send_name_query, name query sent for '*'.

[DEBUG] Did disconnect

[DEBUG] Did end background task

我正在玩tvOS和Xcode 7,但我想如果我能够显示常规的HTML响应就应该没问题...所以我确定我错过了一些东西,或者我错过了一些安装WebServer时的框架(我不使用pod)? 提前致谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值