最近做項目遇到了上傳圖片這個功能,一直弄了兩天才弄出來,在這裡分享給大家。
首先要上傳圖片並不是直接就把圖片通過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