最近做項目遇到了上傳圖片這個功能,一直弄了兩天才弄出來,在這裡分享給大家。
首先要上傳圖片並不是直接就把圖片通過URL上傳的,而是要把圖片轉化為二進制文件。
IOS中有兩個方法,能直接把圖片轉化為二進制
UIImage *image = [UIImage imageNamed:@"8fca9.jpg"];
NSData *data = UIImagePNGRepresentation(image);
NSData *data2 = UIImageJPEGRepresentation(image, 1);
就是運用這兩個方法中的一個把圖片轉化為二進制數據data
然後就是吧data上傳到網絡上。在這裡我用了一個網絡請求的第三方庫 ASIFormDataRequest
具體代碼如下
// 用URL初始化請求
ASIFormDataRequest *request=[[ASIFormDataRequest alloc] initWithURL:url];
// 設置代理
[request setDelegate:self];
// 為上傳對象添加數據 數據
[request addData:data withFileName:@"testimage.png" andContentType:@"image/png" forKey:@"file"];
// 上傳後保存的名字 // 保存類型 // 表單名 和 相應的php 文件相對
[request startAsynchronous];//開始。異步
這就完成了,是不是很簡單。其實這只是做了一半工作。
下面是關於服務器是怎麼處理這個請求的。
我是寫了一個PHP文件,來處理這個網絡請求,下面給出PHP
header("Content-type:text/html;charset=utf-8");
/*bool print_r ( mixed expression [, bool return] ) 詳解
注: 參數 return 是在 PHP 4.3.0 的時候加上的
print_r() 顯示關於一個變量的易於理解的信息。如果給出的是 string、integer 或 float,將打印變量值本身。如果給出的是 array,將會按照一定格式顯示鍵和元素。object 與數組類似。
記住,print_r() 將把數組的指針移到最後邊。
*/
/*$_files 詳解
主要用在當需要上傳二進制文件的地方,錄入上傳一個abc.mp3文件,則服務器端需要獲得該文件的相關信息,則通過變量$_files來取得。
$_FILES['userfile']['name']
客戶端機器文件的原名稱。
$_FILES['userfile']['type']
文件的 MIME 類型,需要浏覽器提供該信息的支持,例如“image/gif”。
$_FILES['userfile']['size']
已上傳文件的大小,單位為字節。
$_FILES['userfile']['tmp_name']
文件被上傳後在服務端儲存的臨時文件名。
$_FILES['userfile']['error']
和該文件上傳相關的錯誤代碼。['error'] 是在 PHP 4.2.0 版本中增加的。
注: 在 PHP 4.1.0 版本以前該數組的名稱為 $HTTP_POST_FILES,它並不像 $_FILES 一樣是自動全局變量。PHP 3 不支持 $HTTP_POST_FILES 數組。
如果表單中沒有選擇上傳的文件,則 PHP 變量 $_FILES['userfile']['size'] 的值將為 0,$_FILES['userfile']['tmp_name'] 將為 none。
*/
print_r($_FILES['file']);
$filename = $_FILES['file']['name'];
if(!$_FILES['file']['error'])
{
/*move_uploaded_file 詳解
http://www.w3school.com.cn/php/func_filesystem_move_uploaded_file.asp
*/
//將文件寫到指定的路徑
if(move_uploaded_file($_FILES['file']['tmp_name'],"./image/user/".$filename)){
echo "上傳文件成功";
}
}else{
echo "文件上傳錯誤";
}
?>
以上就是完整的網絡請求和PHP文件了。
這裡要特別注意的一點是,一定要獲得文件夾的讀寫權限,而且不僅僅是一個文件夾權限,
是整個路徑上所有文件夾的權限。
好今天就跟大家分享這麼一個小知識 ―― LC