-
-
Save Nirma/fb9991be776107d17fdcd6ed2aa02876 to your computer and use it in GitHub Desktop.
import Foundation | |
import CFNetwork | |
public class FTPUpload { | |
fileprivate let ftpBaseUrl: String | |
fileprivate let directoryPath: String | |
fileprivate let username: String | |
fileprivate let password: String | |
public init(baseUrl: String, userName: String, password: String, directoryPath: String) { | |
self.ftpBaseUrl = baseUrl | |
self.username = userName | |
self.password = password | |
self.directoryPath = directoryPath | |
} | |
} | |
// MARK: - Steam Setup | |
extension FTPUpload { | |
private func setFtpUserName(for ftpWriteStream: CFWriteStream, userName: CFString) { | |
let propertyKey = CFStreamPropertyKey(rawValue: kCFStreamPropertyFTPUserName) | |
CFWriteStreamSetProperty(ftpWriteStream, propertyKey, userName) | |
} | |
private func setFtpPassword(for ftpWriteStream: CFWriteStream, password: CFString) { | |
let propertyKey = CFStreamPropertyKey(rawValue: kCFStreamPropertyFTPPassword) | |
CFWriteStreamSetProperty(ftpWriteStream, propertyKey, password) | |
} | |
fileprivate func ftpWriteStream(forFileName fileName: String) -> CFWriteStream? { | |
let fullyQualifiedPath = "ftp://\(ftpBaseUrl)/\(directoryPath)/\(fileName)" | |
guard let ftpUrl = CFURLCreateWithString(kCFAllocatorDefault, fullyQualifiedPath as CFString, nil) else { return nil } | |
let ftpStream = CFWriteStreamCreateWithFTPURL(kCFAllocatorDefault, ftpUrl) | |
let ftpWriteStream = ftpStream.takeRetainedValue() | |
setFtpUserName(for: ftpWriteStream, userName: username as CFString) | |
setFtpPassword(for: ftpWriteStream, password: password as CFString) | |
return ftpWriteStream | |
} | |
} | |
// MARK: - FTP Write | |
extension FTPUpload { | |
public func send(data: Data, with fileName: String, success: @escaping ((Bool)->Void)) { | |
guard let ftpWriteStream = ftpWriteStream(forFileName: fileName) else { | |
success(false) | |
return | |
} | |
if CFWriteStreamOpen(ftpWriteStream) == false { | |
print("Could not open stream") | |
success(false) | |
return | |
} | |
let fileSize = data.count | |
let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: fileSize) | |
data.copyBytes(to: buffer, count: fileSize) | |
defer { | |
CFWriteStreamClose(ftpWriteStream) | |
buffer.deallocate(capacity: fileSize) | |
} | |
var offset: Int = 0 | |
var dataToSendSize: Int = fileSize | |
repeat { | |
let bytesWritten = CFWriteStreamWrite(ftpWriteStream, &buffer[offset], dataToSendSize) | |
if bytesWritten > 0 { | |
offset += bytesWritten.littleEndian | |
dataToSendSize -= bytesWritten | |
continue | |
} else if bytesWritten < 0 { | |
// ERROR | |
print("FTPUpload - ERROR") | |
break | |
} else if bytesWritten == 0 { | |
// SUCCESS | |
print("FTPUpload - Completed!!") | |
break | |
} | |
} while CFWriteStreamCanAcceptBytes(ftpWriteStream) | |
success(true) | |
} | |
} |
How to download/view file from FTP Server.
How create folder in server?
Manually
Now working for me.
I have solved my problem but facing the same problem as you.
The bytesWritten equals to -1 and it is not going to upload anything...
Did you solve your problem?
Works perfectly thank you sir.
not working for me bytesWritten return -1 at first time
I got it. I have looked through the meaning of bytesWritten equals to -1 and it turns out there is error by connection.
By my side it is maybe because of too many connections already existed so I restart my device and it worked then.
anyway, the bytesWritten equals to -1 doesn't mean you have a problem with the file, but it is mostly because of the connection.
Works perfectly thank you sir.
not working for me bytesWritten return -1 at first time
I got it. I have looked through the meaning of bytesWritten equals to -1 and it turns out there is error by connection.
By my side it is maybe because of too many connections already existed so I restart my device and it worked then.anyway, the bytesWritten equals to -1 doesn't mean you have a problem with the file, but it is mostly because of the connection.
It can be because of problem in credentials.
Is there any Lib or same as above class that we can get file URL so that we can load the url or download that attachment?
How create folder in server?