2017-09-08 2 views
0

Je suis en train de tester du code que j'ai trouvé sur github pour télécharger une image via ftp sur mon site web dans une application IOS. Le problème est que lorsque j'essaie de télécharger une image semi-large, l'image téléchargée semble être corrompue avec seulement la partie supérieure montrant et le reste coupé. Il semble fonctionner correctement avec des images plus petites ou une grande image avec une compression plus élevée. Est-ce que quelqu'un sait ce qui cause cela?Le téléchargement de l'image ftp fait que l'image est coupée rapidement

let ftpup = FTPUpload(baseUrl: "mysite.com", userName: "[email protected]", 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!") 
     } 
    }) 

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

Répondre

0

a changé le suivant dans la classe de téléchargement ftp de

while CFWriteStreamCanAcceptBytes(ftpWriteStream) 

à

while (true) 

je trouve qu'il n'acte judiciaire es une fois avec l'ancien.