恩,服务器是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];
也就是说现在可以在网页里用表单的方式上传文件了。现在如果用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];