最近做项目遇到了上传图片这个功能,一直弄了两天才弄出来,在这里分享给大家。
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
<?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