অ্যালামোফায়ার ব্যবহার করে প্যারামিটারগুলি দিয়ে ফাইল আপলোড করা হচ্ছে


95

আমি ব্যবহার করে একটি ফাইল আপলোড করার চেষ্টা করছি Alamofire। কোনও ফাইল ( NSUrl) ব্যবহার করার সময় আপলোডটি ঠিকঠাক কাজ করে , তবে, NSDataবিকল্পটি কীভাবে ব্যবহার করবেন তা আমি বুঝতে পারি না ?

এটি একটি পরীক্ষা হিসাবে আমার কাছে রয়েছে:

 var url:NSURL = NSURL.URLWithString("http://localhost:8080/bike.jpeg")

 var err: NSError?
 var imageData :NSData = NSData.dataWithContentsOfURL(url,options: NSDataReadingOptions.DataReadingMappedIfSafe, error: &err)

 Alamofire.upload(.POST, "http://localhost:8080/rest/service/upload/test.png", imageData)
        .progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in
            println(totalBytesWritten)
        }
        .responseJSON { (request, response, JSON, error) in
            println(request)
            println(response)
           println(JSON)
 }

আমি একটি স্ট্যাটাস কোড পেয়ে যাচ্ছি 415?

এছাড়াও, আমি কীভাবে আপলোডগুলিতে অতিরিক্ত প্যারামগুলি পাঠাতে পারি?

ধন্যবাদ

সম্পাদনা

আমি সঠিক সামগ্রী-প্রকার সেট করছিলাম না:

var manager = Manager.sharedInstance
manager.session.configuration.HTTPAdditionalHeaders = ["Content-Type": "application/octet-stream"]


let imageData: NSMutableData = NSMutableData.dataWithData(UIImageJPEGRepresentation(imageTest.image, 30));

Alamofire.upload(.POST, "http://localhost:8080/rest/service/upload?attachmentName=file.jpg",  imageData)
        .progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in
            println(totalBytesWritten)
        }
        .responseString { (request, response, JSON, error) in
            println(request)
            println(response)
            println(JSON)
}

এখনও আপলোডের সাথে কীভাবে অতিরিক্ত পরামিতি প্রেরণ করা যায় তা বুঝতে পারছি না।


"মাল্টিপার্টফর্মডাটা.এপেন্ডেন্ডবডি পার্ট (ডেটা: ইমেজ 1 ডেটা, নাম:" ফাইল ", ফাইলের নাম:" মাই আইজ.পিএনজি ", মাইমটাইপ:" ইমেজ / পিএনজি ")" এটি ইমপ অন্যথায় ত্রুটি পেতে পারে "অক্ষরের আশেপাশের অবৈধ মান"
অভিজিৎ নাগরে

উত্তর:


81

এখানে একটি সাধারণ ফাংশন যা টার্গেট আপলোড url, পরামিতি এবং ইমেজ ডেটা প্রয়োজন এবং URLFequestConvertible এবং NSData প্রদান করে যা অ্যালামফায়ার.আপলোডকে প্যারামিটার সহ কোনও চিত্র আপলোড করতে হবে।

// this function creates the required URLRequestConvertible and NSData we need to use Alamofire.upload
func urlRequestWithComponents(urlString:String, parameters:Dictionary<String, String>, imageData:NSData) -> (URLRequestConvertible, NSData) {

    // create url request to send
    var mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: urlString)!)
    mutableURLRequest.HTTPMethod = Alamofire.Method.POST.rawValue
    let boundaryConstant = "myRandomBoundary12345";
    let contentType = "multipart/form-data;boundary="+boundaryConstant
    mutableURLRequest.setValue(contentType, forHTTPHeaderField: "Content-Type")



    // create upload data to send
    let uploadData = NSMutableData()

    // add image
    uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
    uploadData.appendData("Content-Disposition: form-data; name=\"file\"; filename=\"file.png\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
    uploadData.appendData("Content-Type: image/png\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
    uploadData.appendData(imageData)

    // add parameters
    for (key, value) in parameters {
        uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        uploadData.appendData("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)".dataUsingEncoding(NSUTF8StringEncoding)!)
    }
    uploadData.appendData("\r\n--\(boundaryConstant)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)



    // return URLRequestConvertible and NSData
    return (Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: nil).0, uploadData)
}    

এটি কীভাবে ব্যবহার করবেন তার উদাহরণ এখানে রয়েছে (তৈরি করুন এবং অনুরোধটি প্রেরণ করুন):

// init paramters Dictionary
var parameters = [
    "task": "task",
    "variable1": "var"
]

// add addtionial parameters
parameters["userId"] = "27"
parameters["body"] = "This is the body text."

// example image data
let image = UIImage(named: "177143.jpg")
let imageData = UIImagePNGRepresentation(image)



// CREATE AND SEND REQUEST ----------

let urlRequest = urlRequestWithComponents("http://example.com/uploadText/", parameters: parameters, imageData: imageData)

Alamofire.upload(urlRequest.0, urlRequest.1)
    .progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in
        println("\(totalBytesWritten) / \(totalBytesExpectedToWrite)")
    }
    .responseJSON { (request, response, JSON, error) in
        println("REQUEST \(request)")
        println("RESPONSE \(response)")
        println("JSON \(JSON)")
        println("ERROR \(error)")
}    

এবং আপনার যদি লক্ষ্য url (একই ডিরেক্টরিতে 'আপলোডস' ফোল্ডার সহ) জন্য পিএইচপি ফাইলের প্রয়োজন হয়:

// get picture variables
$file       = $_FILES['file']['tmp_name'];
$fileName   = $_FILES['file']['name'];
$fileType   = $_FILES['file']['type'];

// check extension
$allowedExts = array("jpg", "jpeg", "png");
$rootName = reset(explode(".", $fileName));
$extension = end(explode(".", $fileName));

// create new file name
$time = time();
$newName = $rootName.$time.'.'.$extension;

// temporarily save file
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], "uploads/".$newName );
if ($moved) $path = "uploads/".$newName;

$body = $_POST['body'];
$userId = $_POST['userId'];


$time = time();
if ($moved) {
    $fullUrl = "http://antiblank.com/testPhotoUpload/".$path;
    $arrayToSend = array('status'=>'success','time'=>$time,'body'=>$body,'userId'=>$userId, "imageURL"=>$fullUrl);
} else {
    $arrayToSend = array('status'=>'FAILED','time'=>$time,'body'=>$body,'userId'=>$userId);
}

header('Content-Type:application/json');
echo json_encode($arrayToSend);

হাই, আমি ইতিমধ্যে এই পদ্ধতিটি ব্যবহার করেছি এবং ভালভাবে কাজ করি server তবে সার্ভারের পাশেই তারা অনুরোধের বিষয়বস্তু JSON পরিবর্তন করে after তারপরে এই পদ্ধতিটি কাজ করছে না j আমি জেসন হিসাবে ডেটা আপলোড করতে চাই ... আপনি কি আমাকে সাহায্য করতে পারেন
মাইচার

4
প্রায় সঠিক, আপলোডডাটা.অ্যাপেন্ডডাটা ("বিষয়বস্তু-বিশৃঙ্খলা: ফর্ম-ডেটা; নাম = \" ফাইল \ "; ফাইলের নাম = \" file.png \ "\ r \ n" .ডাটা ইউজিং এনকোডিং (NSUTF8 স্ট্রিংএকোডিং)!) এই লাইনের নাম = file "ফাইল \", প্রকৃতপক্ষে ফাইল হ'ল মূল নাম যা সার্ভারের সাথে মোকাবেলা করবে..প্যাপারক্লিপের মতো।
আলবার্ট.কুইং

মাইনগুলি আগে কাজ করছিল এবং এখন আমি এনএসকোকাআররলডমোইন কোড 3840 পেয়ে যাচ্ছি, কেউ কি এই সমস্যার সমাধান করেছেন?
গডফাদার

@ এন্টিব্ল্যাঙ্ক এই কোডটি ভাগ করে নেওয়ার জন্য আপনাকে ধন্যবাদ। আপনি ওহকে কীভাবে এই ফাংশনটি পরিবর্তন করতে পরামর্শ দিতে পারেন যাতে এটি NSData গ্রহণ করতে পারে বা ছবির প্যারামিটারটি বাতিল করতে পারে কারণ ব্যবহারকারীরা আমার ওয়েব সার্ভিস কলটিতে কোনও ছবি আপলোড করবেন কিনা সে বিষয়ে বিকল্প রয়েছে। সংজ্ঞায় NSData এর পরিবর্তে আমি যে কোনও অবজেক্ট ব্যবহার করতে পারি
user2363025

4
আমরা কীভাবে শিরোনাম সহ এটি করতে পারি?
পুনম

73

সুইফট 3 এবং 4 এবং অ্যালোমোফায়ার 4 এর মাধ্যমে পরামিতি এবং কাস্টম শিরোনাম সহ ফটো / ফাইল আপলোড করুন

// import Alamofire
func uploadWithAlamofire() {
  let image = UIImage(named: "bodrum")!

  // define parameters
  let parameters = [
    "hometown": "yalikavak",
    "living": "istanbul"
  ]

  Alamofire.upload(multipartFormData: { multipartFormData in
    if let imageData = UIImageJPEGRepresentation(image, 1) {
      multipartFormData.append(imageData, withName: "file", fileName: "file.png", mimeType: "image/png")
    }

    for (key, value) in parameters {
      multipartFormData.append((value?.data(using: .utf8))!, withName: key)
    }}, to: "upload_url", method: .post, headers: ["Authorization": "auth_token"],
        encodingCompletion: { encodingResult in
          switch encodingResult {
          case .success(let upload, _, _):
            upload.response { [weak self] response in
              guard let strongSelf = self else {
                return
              }
              debugPrint(response)
            }
          case .failure(let encodingError):
            print("error:\(encodingError)")
          }
  })
}

সুইফট 2 এবং অ্যালামোফায়ার 3 এর মাধ্যমে

  // import Alamofire
  func uploadWithAlamofire() {
    let image = UIImage(named: "myImage")!

    // define parameters
    let parameters = [
      "hometown": "yalikavak",
      "living": "istanbul"
    ]

    // Begin upload
    Alamofire.upload(.POST, "upload_url",
      // define your headers here
      headers: ["Authorization": "auth_token"],
      multipartFormData: { multipartFormData in

        // import image to request
        if let imageData = UIImageJPEGRepresentation(image, 1) {
          multipartFormData.appendBodyPart(data: imageData, name: "file", fileName: "myImage.png", mimeType: "image/png")
        }

        // import parameters
        for (key, value) in parameters {
          multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key)
        }
      }, // you can customise Threshold if you wish. This is the alamofire's default value
      encodingMemoryThreshold: Manager.MultipartFormDataEncodingMemoryThreshold,
      encodingCompletion: { encodingResult in
        switch encodingResult {
        case .Success(let upload, _, _):
          upload.responseJSON { response in
            debugPrint(response)
          }
        case .Failure(let encodingError):
          print(encodingError)
        }
    })
  }

বর্তমান সুইফ্ট সংস্করণ: https://github.com/Alamofire/Alamofire/blob/master/Docamentation/Usage.md#uploading-data-to-a-server


যে কোনও দেহ আমাকে নীচের রেখাগুলি সম্পর্কে বলতে পারে যদি চিত্রডেটা = ইউআইজিজেজিপিইজি প্রেরণ (চিত্র, 1) {মাল্টিপার্টফর্মডাটা.অ্যাপেন্ড (ইমেজডেটা, নাম: "ফাইল", ফাইল নাম: "ফাইল.পিএনজি", মাইমটাইপ: "চিত্র / পিএনজি")} জন্য (কী, মান) প্যারামিটারে {মাল্টিপার্টফর্মডাটা.অ্যাপেন্ড ((মান? .ডাটা (ব্যবহার: .utf8)) !, সাথে নাম: কী)}}
রবি ওঝা

4
এই যদি কাজ করবে না parametersহয় [String:Any]কারণ value.data(using: .utf8))!জন্য বৈধ নয় Any Type। কীভাবে এটি সমাধান করবেন আপনার পরামর্শ আছে?
Chlebta

57

অ্যান্টিব্ল্যাঙ্কগুলির উত্তরের উপর ভিত্তি করে অ্যালামোফায়ার 3.0 ব্যবহার করে একটি সমাধান এখানে দেওয়া হয়েছে:

 let parameters = [
            "par1": "value",
            "par2": "value2"]    

 let URL = "YOUR_URL.php"

 let image = UIImage(named: "image.png")

 Alamofire.upload(.POST, URL, multipartFormData: {
                multipartFormData in

                if let _image = image {
                    if let imageData = UIImageJPEGRepresentation(_image, 0.5) {
                        multipartFormData.appendBodyPart(data: imageData, name: "file", fileName: "file.png", mimeType: "image/png")
                    }
                }

                for (key, value) in parameters {
                    multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key)
                }

            }, encodingCompletion: {
                encodingResult in

                switch encodingResult {
                case .Success(let upload, _, _):
                     upload.responseObject { (response: Response<UploadData, NSError>) -> Void in

                     switch response.result {
                     case .Success:
                         completionHandler?(success: true)
                     case .Failure(let error):
                         completionHandler?(success: false)
                     }

                 }
                case .Failure(let encodingError):
                    print(encodingError)
                }
        })

আপনি কীভাবে এই আপলোড বাতিল করতে চান? অন্যান্য উত্তরে আমি লোককে কোনও ভারে আপলোড দেওয়ার বিষয়ে আশ্বাস দিতে দেখি কিন্তু যখন আমি এটি করি তবে টাইপটি () হিসাবে অনুমান করা হয়, সুতরাং এই পদ্ধতিগুলিকে আহ্বান করার অনুমতি দেয় না? ধন্যবাদ
শান লিন্টার

@ সানলিন্টার্ন ৮৮: আপনি অনুরোধ-অবজেক্টে বাতিল () কল করতে পারেন। এর মতো কিছু: আপলোডকেনসেল ()। আপনি অনুরোধ-
অবজেক্টটি

4
case .Success(let upload, _, _) uploadখুঁজে পাচ্ছি না. আমি কিছু অনুপস্থিত করছি?
ফাতিহিলিজহান

@ ফাতিহিলিজাহান encodingResultএকটি এনাম MultipartFormDataEncodingResult.Success Case(: নিম্নলিখিত প্যারামিটার আছে request: Request, streamingFromDisk: Bool, streamFileURL: NSURL?) তাই uploadএকটি অনুরোধ। আপনি যোগ করেছেন import Alamofire?
এডফুঙ্কে

আপনি এই সঙ্গে অগ্রগতি রাখা?
hris.to

10

সুইডট ২.২ অ্যালামোফায়ার ৩.৩.১ এর জন্য এডফুঙ্কের উত্তর বাড়ানো

Alamofire.upload(.POST, urlString, multipartFormData: {
            multipartFormData in
            if let _image = self.profilePic.image {
                if let imageData = UIImagePNGRepresentation(_image) {
                    multipartFormData.appendBodyPart(data: imageData, name: "user_image", fileName: "file.png", mimeType: "image/png")
                }
            }
            for (key, value) in userInfo {
                multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key)
            }
            }, encodingCompletion: { encodingResult in
                switch encodingResult {
                case .Success(let upload, _, _):
                    upload.responseJSON { response in
                        debugPrint(response)
                    }
                case .Failure(let encodingError):
                    print(encodingError)
                }
            }
        )

4

মাল্টিপার্ট আপলোডটি আলামোফায়ারের পরবর্তী (1.3.0) রিলিজের সাথে অন্তর্ভুক্ত হওয়ার কথা রয়েছে। এরই মধ্যে, এই থ্রেডের তথ্য ব্যবহার করে, আমি একটি ক্লাস তৈরি করেছি যা ফাইল আপলোডকে সহজতর করে এবং এক বা একাধিক ফাইলের সাথে অনুরোধে অতিরিক্ত পরামিতিগুলি (নিয়মিত "ইনপুট") অন্তর্ভুক্ত করে। ধরে না নিই যে ফাইলগুলি একটি নির্দিষ্ট ধরণের বা রাউটারগুলির ব্যবহার।

ফাইলআপলোডার.সুইফ্ট:

import Foundation
import Alamofire

private struct FileUploadInfo {
  var name:String
  var mimeType:String
  var fileName:String
  var url:NSURL?
  var data:NSData?

  init( name: String, withFileURL url: NSURL, withMimeType mimeType: String? = nil ) {
    self.name = name
    self.url = url
    self.fileName = name
    self.mimeType = "application/octet-stream"
    if mimeType != nil {
      self.mimeType = mimeType!
    }
    if let _name = url.lastPathComponent {
      fileName = _name
    }
    if mimeType == nil, let _extension = url.pathExtension {
      switch _extension.lowercaseString {

      case "jpeg", "jpg":
        self.mimeType = "image/jpeg"

      case "png":
        self.mimeType = "image/png"

      default:
        self.mimeType = "application/octet-stream"
      }
    }
  }

  init( name: String, withData data: NSData, withMimeType mimeType: String ) {
    self.name = name
    self.data = data
    self.fileName = name
    self.mimeType = mimeType
  }
}

class FileUploader {

  private var parameters = [String:String]()
  private var files = [FileUploadInfo]()
  private var headers = [String:String]()

  func setValue( value: String, forParameter parameter: String ) {
    parameters[parameter] = value
  }

  func setValue( value: String, forHeader header: String ) {
    headers[header] = value
  }

  func addParametersFrom( #map: [String:String] ) {
    for (key,value) in map {
      parameters[key] = value
    }
  }

  func addHeadersFrom( #map: [String:String] ) {
    for (key,value) in map {
      headers[key] = value
    }
  }

  func addFileURL( url: NSURL, withName name: String, withMimeType mimeType:String? = nil ) {
    files.append( FileUploadInfo( name: name, withFileURL: url, withMimeType: mimeType ) )
  }

  func addFileData( data: NSData, withName name: String, withMimeType mimeType:String = "application/octet-stream" ) {
    files.append( FileUploadInfo( name: name, withData: data, withMimeType: mimeType ) )
  }

  func uploadFile( request sourceRequest: NSURLRequest ) -> Request? {
    var request = sourceRequest.mutableCopy() as! NSMutableURLRequest
    let boundary = "FileUploader-boundary-\(arc4random())-\(arc4random())"
    request.setValue( "multipart/form-data;boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
    let data = NSMutableData()

    for (name, value) in headers {
      request.setValue(value, forHTTPHeaderField: name)
    }

    // Amazon S3 (probably others) wont take parameters after files, so we put them first        
    for (key, value) in parameters {
      data.appendData("\r\n--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
      data.appendData("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)".dataUsingEncoding(NSUTF8StringEncoding)!)
    }

    for fileUploadInfo in files {
      data.appendData( "\r\n--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)! )
      data.appendData( "Content-Disposition: form-data; name=\"\(fileUploadInfo.name)\"; filename=\"\(fileUploadInfo.fileName)\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
      data.appendData( "Content-Type: \(fileUploadInfo.mimeType)\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
      if fileUploadInfo.data != nil {
        data.appendData( fileUploadInfo.data! )
      }
      else if fileUploadInfo.url != nil, let fileData = NSData(contentsOfURL: fileUploadInfo.url!) {
        data.appendData( fileData )
      }
      else { // ToDo: report error
        return nil
      }
    }

    data.appendData("\r\n--\(boundary)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)

    return Alamofire.upload( request, data )
  }

}

এটি এভাবে ব্যবহার করা হবে:

// This example uploads a file called example.png found in the app resources

let fileURL = NSBundle.mainBundle().URLForResource("example", withExtension: "png")
let fileUploader = FileUploader()
// we can add multiple files
// this would be equivalent to: <input type="file" name="myFile"/>
fileUploader.addFileURL(fileURL!, withName: "myFile")
// we can add NSData objects directly
let data = UIImage(named: "sample")
fileUploader.addFileData( UIImageJPEGRepresentation(data,0.8), withName: "mySecondFile", withMimeType: "image/jpeg" )
// we can also add multiple aditional parameters
// this would be equivalent to: <input type="hidden" name="folderName" value="sample"/>
fileUploader.setValue( "sample", forParameter: "folderName" )
// put your server URL here
var request = NSMutableURLRequest( URL: NSURL(string: "http://myserver.com/uploadFile" )! )
request.HTTPMethod = "POST"
fileUploader.uploadFile(request: request)

এটি দেখুন বা এই सारটি থেকে ডাউনলোড করুন: https://gist.github.com/ncerezo/b1991f8dfac01cb162c0


হাই, উদাহরণস্বরূপ, আইওএসের ক্ষেত্রে আপলোড প্রক্রিয়া সাফল্য বা পরিবর্তে ব্যর্থতা যাচাই করার কোনও উপায় আছে? উত্তর করার জন্য ধন্যবাদ.
জিগিই ওয়াং

হ্যা অবশ্যই. যেমনটি আমি উল্লেখ করেছি, আপলোডফাইলে (অনুরোধ) পদ্ধতিটি অ্যালামোফায়ার.প্রভেস্ট পদ্ধতির মতো একটি অনুরোধ অবজেক্টটি ফেরত দেয়, যাতে আপনি কেবল অগ্রগতি এবং / অথবা প্রতিক্রিয়া বন্ধের শৃঙ্খলাবদ্ধ করতে পারেন। উদাহরণস্বরূপ: fileUploader.uploadFile (অনুরোধ: অনুরোধ)। আপত্তিহীন {(অনুরোধ, প্রতিক্রিয়া, তথ্য, ত্রুটি) ....}
ncerezo

3

@ অ্যান্টিব্ল্যাঙ্কের উত্তরের কোডটি আমার পক্ষে কাজ করছে না। আমি কয়েকটি পরিবর্তন করেছি এবং এটি এখন কাজ করছে:

func urlRequestWithComponents(urlString:String, parameters:NSDictionary) -> (URLRequestConvertible, NSData) {

    // create url request to send
    var mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: urlString)!)
    mutableURLRequest.HTTPMethod = Alamofire.Method.POST.rawValue
    //let boundaryConstant = "myRandomBoundary12345"
    let boundaryConstant = "NET-POST-boundary-\(arc4random())-\(arc4random())"
    let contentType = "multipart/form-data;boundary="+boundaryConstant
    mutableURLRequest.setValue(contentType, forHTTPHeaderField: "Content-Type")


    // create upload data to send
    let uploadData = NSMutableData()

    // add parameters
    for (key, value) in parameters {

        uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)

        if value is NetData {
            // add image
            var postData = value as NetData


            //uploadData.appendData("Content-Disposition: form-data; name=\"\(key)\"; filename=\"\(postData.filename)\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)

            // append content disposition
            var filenameClause = " filename=\"\(postData.filename)\""
            let contentDispositionString = "Content-Disposition: form-data; name=\"\(key)\";\(filenameClause)\r\n"
            let contentDispositionData = contentDispositionString.dataUsingEncoding(NSUTF8StringEncoding)
            uploadData.appendData(contentDispositionData!)


            // append content type
            //uploadData.appendData("Content-Type: image/png\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) // mark this. 
            let contentTypeString = "Content-Type: \(postData.mimeType.getString())\r\n\r\n"
            let contentTypeData = contentTypeString.dataUsingEncoding(NSUTF8StringEncoding)
            uploadData.appendData(contentTypeData!)
            uploadData.appendData(postData.data)

        }else{
            uploadData.appendData("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)".dataUsingEncoding(NSUTF8StringEncoding)!)
        }
    }
    uploadData.appendData("\r\n--\(boundaryConstant)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)



    // return URLRequestConvertible and NSData
    return (Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: nil).0, uploadData)
}

ব্যবহার:

let docDir:AnyObject = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
let imagePath = docDir + "/myPic.jpg"

var imageData = NSData(contentsOfFile: imagePath, options: NSDataReadingOptions.DataReadingMappedIfSafe, error: nil)
var parameters = [
            "pic"           :NetData(nsData: imageData!, filename: "customName.jpg"),
            "otherParm"     :"Value"
        ]


    let urlRequest = self.urlRequestWithComponents("http://www.example.com/upload.php", parameters: parameters)

নেটডাটা থেকে https://github.com/nghialv/Net/blob/master/Net/NetData.swift

আপলোড.এফপি কোড:

<?php
// In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
// of $_FILES.

$uploaddir = 'uploads/';
// PS: custom filed name : pic
$uploadfile = $uploaddir . basename($_FILES['pic']['name']);

if (move_uploaded_file($_FILES['pic']['tmp_name'], $uploadfile)) {
   $array = array ("code" => "1", "message" => "successfully");  
} else {
   $array = array ("code" => "0", "message" => "Possible file upload attack!".$_FILES['pic']['name']); 
}

echo json_encode ( $array );  

?>

আপনি কী পরিবর্তন করেছেন তা যদি আপনি বর্ণনা করেন তবে ভাল লাগবে। এটি কি সাধারণ উন্নতি যা @ অ্যান্টিব্ল্যাঙ্কের উত্তরের সম্পাদনা হতে পারে?
Luís ক্রুজ

4
হাই মিল্জ, হ্যাঁ @ এন্টিব্ল্যাঙ্কের উত্তর থেকে খুব কম পরিবর্তন হয়েছে, কোডটি আমাকে খুব সাহায্য করছে। ধন্যবাদ
ভিনসেন্ট ইয়ান

2

@ অ্যান্টিব্ল্যাঙ্ক এবং @ ভিনসেন্টইয়ান উত্তরগুলির উপর ভিত্তি করে সংক্ষিপ্ত সংস্করণ।

ক্লাস

class Photo {
    class func upload(image: UIImage, filename: String) -> Request {
        let route = Router.CreatePhoto()
        var request = route.URLRequest.mutableCopy() as NSMutableURLRequest
        let boundary = "NET-POST-boundary-\(arc4random())-\(arc4random())"
        request.setValue("multipart/form-data;boundary="+boundary,
                         forHTTPHeaderField: "Content-Type")

        let parameters = NSMutableData()
        for s in ["\r\n--\(boundary)\r\n",
                  "Content-Disposition: form-data; name=\"photos[photo]\";" +
                    " filename=\"\(filename)\"\r\n",
                  "Content-Type: image/png\r\n\r\n"] {
            parameters.appendData(s.dataUsingEncoding(NSUTF8StringEncoding)!)
        }
        parameters.appendData(UIImageJPEGRepresentation(image, 1))
        parameters.appendData("\r\n--\(boundary)--\r\n"
                               .dataUsingEncoding(NSUTF8StringEncoding)!)
        return Alamofire.upload(request, parameters)
    }
}

ব্যবহার

let rep = (asset as ALAsset).defaultRepresentation()
let ref = rep.fullResolutionImage().takeUnretainedValue()
Photo.upload(UIImage(CGImage: ref)!, filename: rep.filename())
    .progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in
        println(totalBytesWritten)
    }
    .responseJSON { (request, response, JSON, error) in
        println(JSON)
    }

@ টমোম্যাটসুমোটো যখন আমি আপনার কোডটি ব্যবহার করার চেষ্টা করেছি তখন "অমীমাংসিত সনাক্তকারী 'রাউটারের ব্যবহার" নামে ত্রুটি পাচ্ছি, আমি মনে করি যে আপনি এখানে ব্যবহার করছেন রাউটার এমন একটি এনাম। আপনি দয়া করে উত্তর আপডেট করতে পারেন? থ্যাঙ্কজ
আঙ্কাহাঠারা

@ আঙ্কাহাথার হয় একটি রাউটার এনাম তৈরি করুন বা ম্যানুয়ালি রাউটার ব্যবহারের পরিবর্তে এনএসআরএল অনুসন্ধান তৈরি করুন। github.com/Alamofire/Alamofire
টম

2

অন্যান্য উত্তরগুলি রয়েছে যা ম্যানুয়ালিভাবে মাল্টিপার্ট অনুরোধগুলি কীভাবে তৈরি করতে হবে সে বিষয়ে পরামর্শ দেওয়ার পরে, আপনি কেবল এএফ নেটওয়ার্কিংয়ের সাথে লেগে থাকতে চান। যদিও এটি উদ্দেশ্য-সিতে লেখা আছে, আপনি এখনও এটি আপনার সুইফ্ট প্রকল্পগুলিতে ব্যবহার করতে পারেন ( একই প্রকল্পে স্যুইট এবং উদ্দেশ্য-সি দেখুন )। যাইহোক, এএফ নেটওয়ার্কিং ব্যবহার করে একটি বহুমাত্রিক অনুরোধ জমা দেওয়ার জন্য সুইফট কোডটি নিম্নরূপ:

let data = UIImagePNGRepresentation(image)

let manager = AFHTTPSessionManager()

manager.POST(uploadURLString, parameters: nil, constructingBodyWithBlock: { formData in
    formData.appendPartWithFileData(data, name: "image", fileName: "test.png", mimeType: "image/png")
}, success: { operation, responseObject in
    println(responseObject)
}) { operation, error in
    println(error)
}

এক্সকোড বিরক্তিকর এই id<AFMultipartFormData>পরামিতিগুলি সনাক্ত করতে সমস্যা রয়েছে formData, সুতরাং আপনি appendPartWithFileDataপদ্ধতিটি বা এর পরামিতিগুলির আদর্শ সম্পাদক কোড সমাপ্তি উপভোগ করবেন না , তবে আপনি যখন এটি সংকলন করেন এবং চালনা করেন, তখন এটি ঠিক কাজ করে।


এটি একটি ভালো দিক, কিন্তু আমি মনে করি যে "ম্যানুয়াল" টুকরা Alamofire কিছুটা ছোট 3. উপরে (নীচে) এই উত্তর দেখুন: stackoverflow.com/a/34961720/8047 ... ধন্যবাদ
ড্যান Rosenstark

1

আপনার অনুরোধে সামগ্রীর ধরণটি হারিয়ে যাওয়ার কারণে আপনি 415 পাচ্ছেন । নীচে সুইফট 2 এবং অ্যালামোফায়ারে চিত্র আপলোড করতে মোট উত্সাহ দেওয়া হচ্ছে

import UIKit
import Alamofire

class ViewController: UIViewController {

@IBOutlet var imageView: UIImageView!
@IBOutlet var btnUpload: UIButton!
override func viewDidLoad() {
    super.viewDidLoad()
}

func successDataHandler(responseData:String){

    print ("IMAGE UPLOAD SUCCESSFUL    !!!")

}

func failureDataHandler(errorData:String){

    print ("  !!!   IMAGE UPLOAD FAILURE   !!! ")

}

@IBAction func actionUpload(sender: AnyObject) {

    let URL = "http://m8coreapibeta.azurewebsites.net/api/cards/SaveImages"

    let postDataProlife:[String:AnyObject] = ["CardId":(dataCardDetail?.userId)!,"ImageType":1,"ImageData":imageView.image!]

    uplaodImageData(URL, postData: postDataProlife, successHandler: successDataHandler, failureHandler: failureDataHandler)
}

func uplaodImageData(RequestURL: String,postData:[String:AnyObject]?,successHandler: (String) -> (),failureHandler: (String) -> ()) -> () {

    let headerData:[String : String] = ["Content-Type":"application/json"]

    Alamofire.request(.POST,RequestURL, parameters: postData, encoding: .URLEncodedInURL, headers: headerData).responseString{ response in
        switch response.result {
        case .Success:
            print(response.response?.statusCode)
            successHandler(response.result.value!)
        case .Failure(let error):
            failureHandler("\(error)")
        }
    }
}
}

0

নীচে দ্রুত এবং পিএইচপি কোড রয়েছে

সুইফট কোড -> অ্যাপল সুইফ্ট সংস্করণ 3.0.1 (সুইফটলং -800.0.58.6 ক্ল্যাং-800.0.42.1) লক্ষ্য: x86_64-আপেল-ম্যাকোসেক্স 10.9

   class  func upload(jsonObject: AnyObject , files : Array<Any>? = nil  , completionHandler :  CompletionBlock? = nil ,failureHandler : FailureBlock? = nil )
{

    Alamofire.upload(multipartFormData:
        { (multipartFormData) in

            if let  filesO = files
            {
                for i in (filesO.enumerated())
                {
                    let image = UIImage(named: "\(i.element)")

                    let data = UIImageJPEGRepresentation(image!, 1)!

                    multipartFormData.append(data, withName: "imgFiles[]" , fileName: "\( NSUUID().uuidString).jpeg" , mimeType: "image/jpeg")
                  // imgFiles[] give array in Php Side
                  // imgFiles   will give string in PHP String


                }

            }


            for  (key, value)  in jsonObject as! [String : String]
            {

                 multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)

            }}          
    },
                     to:baseURL)

প্যারামিটার এবং ফাইল পেতে পিএইচপি কোড

এখানে প্যারামিটারগুলি হ্যান্ডল $ _ রিকোয়েস্টে রয়েছে

এবং ফাইলগুলি handle _ ফাইলটিতে হ্যান্ডেল করা হয়

$ _ফায়াল ডেটাতে বিন্যাস (অ্যারে, অভিধান বা স্ট্রিং) দ্রুতগতিতে অনুরোধের উপর নির্ভর করবে, কোডে এই লাইনটি দেখুন

মাল্টিপার্টফর্মডাটা.অ্যাপেন্ড (ডেটা, নাম সহ: "imgFiles []", ফাইলের নাম: "(এনএসইউইডি ()। uuidString) .jpeg", মাইমটাইপ: "চিত্র / jpeg")

নাম সহ পিএইচপি পাশ: "imgFiles []" নাম, বিন্যাস, প্রকারের অ্যারে দেয়

যেমন

"নাম": ["06748B86-478E-421B-8470-6262755AC149.jpeg", "E70269E9-FB54-4BFD-B807-7E418C81540D.jpeg"], "টাইপ": ["চিত্র / jpeg", "চিত্র / jpeg" ], "tmp_name": ["/ tmp / phpz3UAPq", "/ tmp / phpCAPExG"], "ত্রুটি": [0,0], "আকার": [2779495,2067259]}

পিএইচপি কোড

 if (isset($_FILES['imgFiles']) and strlen($orderId) > 0) {

        foreach ($_FILES['imgFiles']['tmp_name'] as $key => $tmp_name) {

            $file_name = $key . $_FILES['imgFiles']['name'][$key];
            $file_size = $_FILES['imgFiles']['size'][$key];
            $file_tmp = $_FILES['imgFiles']['tmp_name'][$key];
            $file_type = $_FILES['imgFiles']['type'][$key];
 if (is_dir("$desired_dir/" . $file_name) == false) {
                //move_uploaded_file($file_tmp, "user_data/" . $file_name);
                move_uploaded_file($file_tmp, $desired_dir . "/" .
           $file_name);
            } else {         //rename the file if another one exist
                $new_dir = $desired_dir . "/" . $file_name . time();
                rename($file_tmp, $new_dir);
            }

-2

আমি অ্যান্টিব্ল্যাঙ্কের উত্তর নিয়েছি এবং সম্পূর্ণরূপে হ্যান্ডলারের সাহায্যে এগুলি 1 টি ফাংশনে গুটিয়ে রেখেছি। ভেবেছি এটি কারওর পক্ষে কার্যকর হতে পারে। এটি কিছুটা 'রাউগার' তখন অ্যান্টিব্ল্যাঙ্কের উত্তর হিসাবে আমি কেবল পিএইচপি ফাইল (জেএসএন নয়) থেকে স্ট্রিং প্রতিক্রিয়া নিচ্ছি।

আপনি এটি কল কিভাবে এখানে:

let imageData = UIImagePNGRepresentation(myImageView.image)

uploadImage("http://www.example.com/image_upload.php", imageData: imageData, subdir: "images", filename: "imageID.png")
    { (req, res, str, err) -> Void in
        // do whatever you want to to for error handling and handeling success
    }

এখানে ফাংশনটি নিজেই:

func uploadImage(urlToPHPFile: String, imageData: NSData, subdir: String, filename: String, completionHandler:(request:NSURLRequest, response:NSURLResponse?, responseString:String?, error: NSError?) -> ()) {

    func urlRequestWithComponents(urlString:String, parameters:Dictionary<String, String>, imageData:NSData) -> (URLRequestConvertible, NSData) {
        // create url request to send
        var mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: urlString)!)
        mutableURLRequest.HTTPMethod = Method.POST.rawValue
        let boundaryConstant = "myRandomBoundary12345";
        let contentType = "multipart/form-data;boundary="+boundaryConstant
        mutableURLRequest.setValue(contentType, forHTTPHeaderField: "Content-Type")

        // create upload data to send
        let uploadData = NSMutableData()

        // add image
        uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        uploadData.appendData("Content-Disposition: form-data; name=\"file\"; filename=\"file.png\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        uploadData.appendData("Content-Type: image/png\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        uploadData.appendData(imageData)

        // add parameters
        for (key, value) in parameters {
            uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
            uploadData.appendData("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)".dataUsingEncoding(NSUTF8StringEncoding)!)
        }
        uploadData.appendData("\r\n--\(boundaryConstant)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)

        // return URLRequestConvertible and NSData
        return (ParameterEncoding.URL.encode(mutableURLRequest, parameters: nil).0, uploadData)
    }

    let parameters = [
        "subdir" : subdir,
        "filename": filename
    ]
    let urlRequest = urlRequestWithComponents(urlToPHPFile, parameters, imageData)

    AlamoFire.upload(urlRequest.0, urlRequest.1)
        .responseString(completionHandler: { [weak self] (req, res, str, err) -> Void in
            if let strongSelf = self {
                completionHandler(request: req, response: res, responseString: str, error: err)

            }
        }
    )
}

এবং এখানে পিএইচপি ফাইল।

$subdir = $_POST['subdir'];
$filename = $_POST["filename"];

$targetPath = $subdir.'/'.$filename;

$moved = move_uploaded_file($_FILES["file"]["tmp_name"], $targetPath );
if ($moved) {
    echo "OK";
}
else {
    echo "Error: file not uploaded";
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.