需求:iOS端需要写一个上传文件到服务器的功能
客户端
现有工程用的网络库是 Alamofire
func uploadFile(_ filePath : URL){
Alamofire.upload(
//采用post表单上传
multipartFormData: { multipartFormData in
// multipartFormData.append(filePath, withName: "file", fileName: "1.zip", mimeType: "application/zip")
multipartFormData.append(filePath, withName: "file")
//服务器地址
},to: "http://127.0.0.1/1/upload.php",encodingCompletion: { encodingResult in
switch encodingResult {
case .success(let upload, _, _):
//json处理
upload.responseJSON { response in
debugPrint(response)
//解包
guard let result = response.result.value else { return }
print("json:\(result)")
}
//上传进度
upload.uploadProgress(queue: DispatchQueue.global(qos: .utility)) { progress in
print("文件上传进度: \(progress.fractionCompleted)")
}
case .failure(let encodingError):
debugPrint(encodingError)
}
})
}
调用上面的上传函数,将 1.zip
这个文件上传服务器
let zip = Bundle.main.path(forResource: "1", ofType: "zip")
let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
let filePathStr = paths[0]+"/1.zip"
FileManager.default.removeItem(atPath: filePathStr)
try! FileManager.default.copyItem(atPath: zip!, toPath: filePathStr)
let fileUrl = URL.init(fileURLWithPath: filePathStr)
uploadFile(fileUrl)
服务端
服务器用的就是本机的 Apache
启动 Apache 服务
sudo apachectl start
重启
sudo apachectl restart
停止
sudo apachectl stop
在启动 Apache 服务前,先修改一下配置,或者修改后重启也可以。
修改 /private/etc/apache2/httpd.conf
文件,搜索 php
会搜到 LoadModule php7_module libexec/apache2/libphp7.so
,将这一行前面的#
符号删掉
执行命令 sudo cp /private/etc/php.ini.default /private/etc/php.ini
执行到这里,如果上传的文件小于2M,就可以重启 Apache 服务了。
如果文件比较大,就要修改php.ini
文件
-
file_uploads = on ;
是否允许通过HTTP上传文件的开关。默认为ON即是开 -
upload_tmp_dir ;
文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹 -
upload_max_filesize = 8m ;
允许上传文件大小的最大值。默认为2M -
post_max_size = 8m ;
指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M
修改上面的参数,就可以写上传稍微大一点的文件了。
服务端代码
在 /Library/WebServer/Documents
目录下随意创建两个目录 1
、 1/upload
(名字无任何意义,就是图简单)
创建 upload.php
文件存放在目录 1
下,该文件内容就是下面的代码
<?php
$response = array();
$target_path = $_SERVER['DOCUMENT_ROOT']."/1/upload/";//接收文件目录
$target_path = $target_path . basename( $_FILES['file']['name']);
if(move_uploaded_file($_FILES['file']['tmp_name'], $target_path)) {
$response ['success'] = "The file ". basename( $_FILES['file']['name']). " has been uploaded";
} else{
$response ['error'] = "There was an error uploading the file, please try again!". $_FILES['file']['error'];
}
echo json_encode($response);
?>
文件上传到服务端,先存储到一个临时目录,然后上面这段 php 代码就是将客户端通过 POST 上传上来的临时文件移动到你指定的目录下,这里的指定目录是 /Library/WebServer/Documents/1/upload
ps:
echo
打印的就是服务端返回给客户端的字符串内容
upload
目录要有读写权限
URL
如果是 文件URL ,字符串以file:
开头
客户端的 withName: "file"
必须和服务端的 $_FILES['file']
相同