您的位置:首页 > 理论基础 > 计算机网络

如何使用ASIHTTPRequest从iOS端向服务器上传文件?

2011-12-15 09:23 756 查看
恩,服务器是php,http://www.92apps.com/up2.php,如果访问http://www.92apps.com/upup.htm的话,通过表单方式可以上传文件。

也就是说现在可以在网页里用表单的方式上传文件了。现在如果用iOS客户端的话,代码如下:

NSString *a = @"http://www.92apps.com/up2.php";

NSURL *url = [NSURL URLWithString:a];

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];

[request setDelegate:self];

[request startAsynchronous];

[request setFile:file forKey:@"photo"];

NSLog(@"%i",[request responseStatusCode]);

结果上传文件失败, NSLog(@"%i",[request responseStatusCode]) 打印结果是 0 。

这是客户端的代码问题呢?还是说服务器端php代码需要做相应调整,应该如何写呢?

附up2.php代码:

<?php

//文件存储路径

$file_path="upload/";

//664权限为文件属主和属组用户可读和写,其他用户只读。

if(is_dir($file_path)!=TRUE) mkdir($file_path,0664) ;

//定义允许上传的文件扩展名

$ext_arr = array("gif", "jpg", "jpeg", "png", "bmp", "txt", "zip", "rar");

if (empty($_FILES) === false) {

//判断检查

if($photo_up_size > 2097152){

exit("对不起,您上传的照片超过了2M。");

}

if($_FILES["file"]["error"] > 0){

exit("文件上传发生错误:".$_FILES["file"]["error"]);

}

//获得文件扩展名

$temp_arr = explode(".", $_FILES["file"]["name"]);

$file_ext = array_pop($temp_arr);

$file_ext = trim($file_ext);

$file_ext = strtolower($file_ext);

//检查扩展名

if (in_array($file_ext, $ext_arr) === false) {

exit("上传文件扩展名是不允许的扩展名。");

}

//以时间戳重命名文件

$new_name = time().".".$file_ext;

//将文件移动到存储目录下

move_uploaded_file($_FILES["file"]["tmp_name"],"$file_path" . $new_name);

//向数据表写入文件存储信息以便管理

//*********** 代码略 ***********//

echo "文件上传成功!";

exit;

} else {

echo "无正确的文件上传";

}

?>

附upup.htm代码:

<form enctype="multipart/form-data" action="upload.php" method="post">

<label for="file">请选择上传的文件</label>

<input type="file" name="file" size="40" />

<br />

<input type="submit" name="submit" value="确定" />

</form>

下面我他妈的说说这么解决,擦,解决方法特2b:

首先呢,就是加入调试代码:

- (void)uploadRequestFinished:(ASIHTTPRequest *)request{

NSData *responseData = [request responseData];

// Store incoming data into a string

NSString *response = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

NSLog(@"Server response:%@", response);

}

- (void)uploadRequestFailed:(ASIHTTPRequest *)request{

NSLog(@"[TWDEBUG] Error - upload failed: \"%@\"",[[request error] localizedDescription]);

}

然后写这几句,对比上面的:

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];

[request setDelegate:self];

[request setRequestMethod:@"POST"];

[request setFile:file forKey:@"photo"];

[request setDidFinishSelector:@selector(uploadRequestFinished:)];

[request setDidFailSelector:@selector(uploadRequestFailed:)];

[request startAsynchronous];

运行后,显示“文件扩展名出错。”恩,至少知道是什么问题了,然后吭哧吭哧试验一圈,最后锁定

[request setFile:file forKey:@"photo"];

这句话的forKey参数,毫无tm头绪,然后google,然后各种试验,最后终于finally,问题解决,这么写就他妈行了:

[request setFile:file forKey:@"file"];

你敢信吗?

文件上传成功,擦!

另,如果request很大,那么为这个request设置流式读取模式。

[request setShouldStreamPostDataFromDisk:YES];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: