Allthough一些答案,把我推在正確的方向,他們仍然不適合我的項目,所以我繼續在谷歌上搜索我設法找到我需要在下面的文章到底是什麼:http://swiftdeveloperblog.com/image-upload-example/
我需要異步發出HTTP請求並使用會話, 我沒有在問題中指定,因爲問題僅僅是關於如何在單個請求中同時發送幾個參數和數據。
這樣做時稱爲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文件被稱爲 php.ini
被配置爲接受比你的數據更小的文件試圖上傳的。
例如:如果php.ini
配置爲接受2 MB,那麼任何 上傳大於2 MB將被忽略,你的應用程序將收到 迴應說,出事了。
要更改php.ini
文件大小接受你需要尋找 變量稱爲upload_max_filesize
和post_max_size
和改變那些無論文件大小 您的系統要求。
但哪一個照片數據?我可以一步一步看到有參數,但最終請求中的照片數據在哪裏? 此外,你的榜樣是不是異步的,並且不使用會話,這是不是蘋果了建議。 – vaid
請參閱編輯。發送數據的 一種方式是 - 將您的照片數據,以Base64String,並將其發送 – Sanju
謝謝你的答案,但我設法找到適合我的問題完全別處的信息,我分享了我的結論,並寫了我自己的答案。 – vaid