Advertisement
Guest User

Untitled

a guest
Nov 19th, 2016
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.93 KB | None | 0 0
  1. import CFNetwork
  2. import Foundation
  3.  
  4. class FTPUpload {
  5. fileprivate let ftpBaseUrl: String
  6. fileprivate let directoryPath: String
  7. fileprivate let username: String
  8. fileprivate let password: String
  9.  
  10. init(baseUrl: String, userName: String, password: String, directoryPath: String) {
  11. self.ftpBaseUrl = baseUrl
  12. self.username = userName
  13. self.password = password
  14. self.directoryPath = directoryPath
  15. }
  16. }
  17.  
  18.  
  19. // MARK: Steam Setup
  20.  
  21. extension FTPImageUpload {
  22. private func setFtpUserName(for ftpWriteStream: CFWriteStream, userName: CFString) {
  23. let propertyKey = CFStreamPropertyKey(rawValue: kCFStreamPropertyFTPUserName)
  24. CFWriteStreamSetProperty(ftpWriteStream, propertyKey, userName)
  25. }
  26.  
  27. private func setFtpPassword(for ftpWriteStream: CFWriteStream, password: CFString) {
  28. let propertyKey = CFStreamPropertyKey(rawValue: kCFStreamPropertyFTPPassword)
  29. CFWriteStreamSetProperty(ftpWriteStream, propertyKey, password)
  30. }
  31.  
  32. fileprivate func ftpWriteStream(forFileName fileName: String) -> CFWriteStream? {
  33. let fullyQualifiedPath = "ftp://\(ftpBaseUrl)/\(directoryPath)/\(fileName)"
  34.  
  35. guard let ftpUrl = CFURLCreateWithString(kCFAllocatorDefault, fullyQualifiedPath as CFString, nil) else { return nil }
  36. let ftpStream = CFWriteStreamCreateWithFTPURL(kCFAllocatorDefault, ftpUrl)
  37. let ftpWriteStream = ftpStream.takeRetainedValue()
  38. setFtpUserName(for: ftpWriteStream, userName: username as CFString)
  39. setFtpPassword(for: ftpWriteStream, password: password as CFString)
  40. return ftpWriteStream
  41. }
  42. }
  43.  
  44.  
  45. // MARK: FTP Write
  46.  
  47. extension FTPImageUpload {
  48. func send(data: Data, with fileName: String, success: @escaping ((Bool)->Void)) {
  49.  
  50. guard let ftpWriteStream = ftpWriteStream(forFileName: fileName) else {
  51. success(false)
  52. return
  53. }
  54.  
  55. if CFWriteStreamOpen(ftpWriteStream) == false {
  56. print("Could not open stream")
  57. success(false)
  58. return
  59. }
  60.  
  61. defer { CFWriteStreamClose(ftpWriteStream) }
  62.  
  63. let fileSize = data.count
  64. let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: fileSize)
  65. data.copyBytes(to: buffer, count: fileSize)
  66. var offset = 0
  67. var dataToSendSize = fileSize
  68.  
  69. repeat {
  70. let bytesWritten = CFWriteStreamWrite(ftpWriteStream, &buffer[offset], dataToSendSize)
  71. if bytesWritten > 0 {
  72. offset += bytesWritten.littleEndian
  73. dataToSendSize -= bytesWritten
  74. continue
  75. } else if bytesWritten < 0 {
  76. // ERROR
  77. print("ERROR ERROR ERROR")
  78. break
  79. } else if bytesWritten == 0 {
  80. // SUCCESS
  81. print("Completed!!")
  82. break
  83. }
  84.  
  85. } while CFWriteStreamCanAcceptBytes(ftpWriteStream)
  86.  
  87. success(true)
  88. return
  89. }
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement