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

恩,服务器是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];
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值