2017-09-08 7 views
0

IOS 응용 프로그램에서 ftp를 통해 이미지를 업로드하기 위해 github에서 찾은 일부 코드를 테스트하고 있습니다. 문제는 반 대형 이미지를 업로드하려고 할 때 업로드 된 이미지가 윗부분 만 표시되고 나머지 부분은 잘린 상태로 손상된 것 같습니다. 더 작은 이미지 나 더 높은 압축의 큰 이미지에서는 문제없이 작동하는 것 같습니다. 누구든지이 원인을 알고 있습니까?ftp 이미지 업로드로 인해 이미지가 잘릴 수 있습니다.

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

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

답변

0

나는 단지 영장 것을 발견

while (true) 

while CFWriteStreamCanAcceptBytes(ftpWriteStream) 

에서는 FTP 업로드 클래스 내에서 다음과 같이 변경 한 번은 전자로.