2016-11-17 23 views
0

iPhoneからWebサーバーに写真を送信する方法を理解しようとしています。Swiftを使用してパラメータとデータをWebサーバーに送信する3

また、パラメータデータと同じリクエスト内の写真のファイル名やその他の追加情報も含めて、パラメータを送信する必要があります。

次のコードは、私が考える正しい軌道に乗っているが、どこでparamsと呼ばれるパラメータデータを入れてください:

 let params: Array<String> = [aI.filename, String(aI.size), String(aI.dateTime.year), String(aI.dateTime.month), String(aI.dateTime.day), String(aI.dateTime.hour), String(aI.dateTime.minute), String(aI.dateTime.second), String(aI.dateTime.millisecond)] 


     var serverURL = URL(string: "http://192.168.0.23/upload.php"); 
     var req = NSMutableURLRequest(url: serverURL!, cachePolicy: NSURLRequest.CachePolicy.useProtocolCachePolicy, timeoutInterval: 60.0); 
     //Set request to post 
     req.httpMethod = "POST"; 

     //Set content type 
     req.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type"); 


     let task = URLSession.sharedSession().dataTaskWithRequest(req){ data, response, error in 
      if error != nil{ 
       print("Error -> \(error)") 
       return 
      } 

      do { 
       let result = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? [String:AnyObject] 

       print("Result -> \(result)") 

      } catch { 
       print("Error -> \(error)") 
      } 
     } 

     task.resume() 
     return task 

答えて

1

が正しい方向に私をプッシュし、彼らはまだ私のプロジェクトに適合していなかったので、私は私が次の資料に必要な正確に何を見つけることができたグーグル続け:http://swiftdeveloperblog.com/image-upload-example/

I HTTPリクエストを非同期的に行い、セッションを使用する必要がありました。なぜなら、質問は単なる1つのリクエストで複数のパラメータを両方ともデータとともに送信する方法に関するものだったからです。

こうするとMultipart Form Dataと呼ばれます。

私はそう、私は以下の私のスウィフト3コードを共有してい 、それは自分のアプリケーションのために動作させるために記事から少しのコードを変更する必要がありました:

トリガ・コード

let params = [ 
      "filename"  : chunkOwner.filename      , 
      "size"   : String(describing: chunkOwner.size)     , 
      "year"   : String(chunkOwner.dateTime.year)   , 
      "month"   : String(chunkOwner.dateTime.month)   , 
      "day"   : String(chunkOwner.dateTime.day)   , 
      "hour"   : String(chunkOwner.dateTime.hour)   , 
      "minute"  : String(chunkOwner.dateTime.minute)  , 
      "second"  : String(chunkOwner.dateTime.second)  , 
      "millisecond" : String(chunkOwner.dateTime.millisecond) , 
     ] 

uploadChunk(url: URL(string: "http://192.168.0.23/upload.php")!, data: photoData, params: params) 

アップロードコード:

func uploadData(url: URL, data: Data!, params: [String: String]) 
    { 
     let cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringLocalCacheData; 
     let request = NSMutableURLRequest(url: url, cachePolicy: cachePolicy, timeoutInterval: 6.0); 
     request.httpMethod = "POST"; 

     let boundary = generateBoundaryString() 

     request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") 


     if(data == nil) { return; } 

     request.httpBody = createBodyWithParameters(parameters: params, filePathKey: "file", data: data, boundary: boundary) 



     //myActivityIndicator.startAnimating(); 

     let task = URLSession.shared.dataTask(with: request as URLRequest) { 
      data, response, error in 

      if error != nil { 
       print("error=\(error)") 
       return 
      } 

      // You can print out response object 
      print("******* response = \(response)") 

      // Print out reponse body 
      let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) 
      print("****** response data = \(responseString!)") 

      do { 
       let json = try JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary 

       print(json) 



      }catch 
      { 
       //if you recieve an error saying that the data could not be uploaded, 
       //make sure that the upload size is set to something higher than the size 
       print(error) 
      } 


     } 

     task.resume() 

    } 


    func createBodyWithParameters(parameters: [String: String]?, filePathKey: String?, data: Data!, boundary: String) -> Data { 
     var body = Data(); 

     if parameters != nil { 
      for (key, value) in parameters! { 
       body.appendString(string: "--\(boundary)\r\n") 
       body.appendString(string: "Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n") 
       body.appendString(string: "\(value)\r\n") 
      } 
     } 

     let mimetype = "text/csv" 

     body.appendString(string: "--\(boundary)\r\n") 
     body.appendString(string: "Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(parameters!["filename"]!)\"\r\n") 
     body.appendString(string: "Content-Type: \(mimetype)\r\n\r\n") 


     body.append(data) 
     body.appendString(string: "\r\n") 

     body.appendString(string: "--\(boundary)--\r\n") 

     return body 
    } 




    func generateBoundaryString() -> String { 
     return "Boundary-\(NSUUID().uuidString)" 
    } 

はまた、あなたの下部に次のコードが含まれますあなたのクラスの外ファイル:

extension Data { 
    mutating func appendString(string: String) { 
     append(string.data(using: .utf8)!) 
    } 
} 

とPHPのアップロードスクリプトのために私はいくつかの変更を行なったし、次のようになります。

<?php 
    $target_dir = "/var/www/html/uploads";if(!file_exists($target_dir)){ 
     mkdir($target_dir, 0777, true); 
    } 

    $target_dir = $target_dir . "/" . basename($_FILES["file"]["name"]); 
    echo count("size: ".$_FILES["file"]["tmp_name"]); 


    if (move_uploaded_file($_FILES["file"]["tmp_name"], $target_dir)){ 

     echo json_encode([ 
      "Message" => "The file ". basename($_FILES["file"]["name"]). " has been uploaded.", 
      "Status" => "OK", 
     ]); 

    } else { 

     echo json_encode([ 
      "Message" => "Sorry, there was an error uploading your file.", 
      "Status" => "Error", 
     ]); 

    } 
?> 

重要な注意:

アプリ php.iniというサーバーのPHPファイルが、あなたのデータよりも小さいファイルを受け入れるように設定されている場合は、データをアップロードできません。 アップロードしようとしています。例えば

php.iniが2メガバイトを受け入れるように構成されている場合は、2メガバイトを超えるすべての アップロードが無視され、あなたのアプリケーションは、何かが間違っていたと言って 応答を受信します。

あなたはupload_max_filesizepost_max_size呼ば 変数を探して、あなたのシステムが必要と どんなファイルサイズにそれらを変更する必要がphp.iniでファイルサイズの受け入れを変更するには。

0

あなたは(NSInputStreamを使用して)httpBodyまたはhttpBodyStream

それらを置くことができます

しかし、サーバープロトコルのパラメータ(xml、json、バイナリデータなど)をカスタム形式で変換することを忘れないでください。あなたのコンテンツタイプ(アプリケーション/ x-www-form-urlencodedで)のために
、あなたはwikipediaでフォーマットを見つけることができます。

keyName=value&keyName2=value2 

キーと値は、あなたがstringByAddingPercentEncodingWithAllowedCharactersを使用することができ、それを達成するために、URLPathAllowedCharacterSetの含まれている必要があります。
KeyValue文字列をNSDataに変換するには、メソッドdataUsingEncodingを使用できます。

0

私はあなたにSwift3

あなたのURL

var serverURL = URL(string: "http://192.168.0.23/upload.php") 

あなたのパラメータは、単にパス・データを必要とすることができ、どのパラメータにサーバの人々と話し合う、このようなことにNSURLConnectionを使用してデータを掲示する1つの方法を共有しています次に、そのパラメータに値を割り当てます。

serverparameter1 = \(value to post)& serverparameter2 = \(value to post2)....... 

あなたのパラメータで私はこれを見ました

let params = "filename= \(aI.filename)&size = \(String(aI.size))& dateTimeYear =\(String(aI.dateTime.year))&dateTimeMonth =\(String(aI.dateTime.month))& dateTimeDay =\(String(aI.dateTime.day))&dateTimeHour =\(String(aI.dateTime.hour))&dateTimeMinute =\(String(aI.dateTime.minute))&dateTimeSecond =\(String(aI.dateTime.second))&dateTimeMilliSecond=\(String(aI.dateTime.millisecond))" 

、最終的なURLが

\(serverURL)/\(params) 

OR

のように見えているように見える、その後stringParameter

として
&ImageDataStr = \(base64String) 

を渡す

var base64String: NSString! 
let myImage = UIImage(named:"image.png") 
let imageData = UIImageJPEGRepresentation(myImage, 0.9) 
base64String = imageData!.base64EncodedString(options: NSData.Base64EncodingOptions.endLineWithLineFeed) as NSString! 
print(base64String) 

以下のようにBase64Stringにあなたの写真データを変換ステップ要求による

\(serverURL)/Upload?\(params) 

ステップは、ここで

var serverURL = URL(string: "http://192.168.0.23/upload.php") 

    let params = "filename= \(aI.filename)&size = \(String(aI.size))& dateTimeYear =\(String(aI.dateTime.year))&dateTimeMonth =\(String(aI.dateTime.month))& dateTimeDay =\(String(aI.dateTime.day))&dateTimeHour =\(String(aI.dateTime.hour))&dateTimeMinute =\(String(aI.dateTime.minute))&dateTimeSecond =\(String(aI.dateTime.second))&dateTimeMilliSecond=\(String(aI.dateTime.millisecond))&photoDataStr = \(base64String)" 

    var status:NSString = "\(serverURL)/Upload?\(params)" as NSString 

    status = status.addingPercentEscapes(using: String.Encoding.utf8.rawValue)! as NSString 


    let url = URL(string: status as String)! 


    let request = URLRequest(url: url, cachePolicy:NSURLRequest.CachePolicy.reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 600) 
    // need synchronous 

あなたは

 var response:URLResponse? 
     var responseD:Data = try! NSURLConnection.sendSynchronousRequest(request, returning:&response) 

が最後にBinaryDataがあなたの結果の例については

// save to string - the result came from the Server call 
    var serverResults:NSString = NSString(data: responseD, encoding: String.Encoding.utf8.rawValue)! 

    print(serverResults) 

を読めるすることを確認responseDataを取得します

01回答の一部Allthough
if serverResults.range(of: "RESULT&gt;APPROVED").location != NSNotFound 
    { 
     return "Data posted" 
    } 
    else 
    { 
     return "Failed to post" 
    } 
+0

写真のデータはどこですか?私はステップバイステップでそこにparamsがあるのを見ることができますが、最後のリクエストの写真データはどこにありますか? また、あなたのサンプルは非同期ではなく、セッションを使用しません。これはAppleによってはもう推奨されません。 – vaid

+0

編集を参照してください。 データを送信する方法の1つは - 写真データをBase64Stringに変換して送信する – Sanju

+0

ありがとうございましたが、私の質問に完全に合った情報を見つけ出すことができました。私は結論を共有して自分の答えを書きました。 – vaid

関連する問題