が正しい方向に私をプッシュし、彼らはまだ私のプロジェクトに適合していなかったので、私は私が次の資料に必要な正確に何を見つけることができたグーグル続け: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_filesize
とpost_max_size
呼ば 変数を探して、あなたのシステムが必要と どんなファイルサイズにそれらを変更する必要がphp.ini
でファイルサイズの受け入れを変更するには。
写真のデータはどこですか?私はステップバイステップでそこにparamsがあるのを見ることができますが、最後のリクエストの写真データはどこにありますか? また、あなたのサンプルは非同期ではなく、セッションを使用しません。これはAppleによってはもう推奨されません。 – vaid
編集を参照してください。 データを送信する方法の1つは - 写真データをBase64Stringに変換して送信する – Sanju
ありがとうございましたが、私の質問に完全に合った情報を見つけ出すことができました。私は結論を共有して自分の答えを書きました。 – vaid