ios - ftp图片上传导致图片被快速截断

标签 ios swift ftp web-hosting

我正在测试在 github 上找到的一些代码,以通过 ftp 将图像上传到 IOS 应用程序中的我的网站。问题是,当我尝试上传半大图像时,上传的图像似乎已损坏,仅显示顶部部分,其余部分被切断。它似乎可以很好地处理较小的图像或具有较高压缩率的大图像。有谁知道是什么原因造成的?

    let ftpup = FTPUpload(baseUrl: "mysite.com", userName: "user@mysite.com", password: "password", directoryPath: "")

    let image = UIImage(named: "medium")
    let imagedata = UIImageJPEGRepresentation(image!, 1)

    ftpup.send(data: imagedata!, with: "cloudpowa.jpg", success: {(success) -> Void in
        if !success {
            print("Failed upload!")
        }
        else {
            print("image uploaded!")
        }
    })

ftp 代码来自:https://gist.github.com/Nirma/fb9991be776107d17fdcd6ed2aa02876

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)
    }
}

最佳答案

在 ftp 上传类中更改了以下内容

while CFWriteStreamCanAcceptBytes(ftpWriteStream)

while (true)

我发现前者只写一次。

关于ios - ftp图片上传导致图片被快速截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46107445/

相关文章:

ios - Jenkins无法导出应用商店ipa

ios - react native Firebase

ios - RxSwift 上有某种优先级运算符吗?

ios - alamofire,下载多张图片

linux - Django,我在尝试访问提供给 ftp 用户的目录时收到 "Permission Denied"

ios - 如何在 SFSafariViewController 上实现 SSL Pinning?

ios - NSHashTable 计数错误地报告非空

ios - UISwipeGestureRecognizer 动画

ftp - Azure网站FTP访问/530用户无法登录

ftp - VSFTPD 和 Centos 6.2 的写入权限