从iOS中的PHP函数下载文件

时间:2013-01-12 20:58:03

标签: ios

我正在尝试从我的iOS应用中的PHP服务下载文件。我从Android和浏览器使用相同的PHP服务,服务器部分工作正常。我可以在浏览器中测试网址,并提示您按照预期下载文件。 如果我直接从我的iOS代码中将文件指向该文件,我也可以下载文件。这些是zip文件。我必须使用此方法,因为我需要通过id获取文件,我必须传递访问令牌字符串。这些验证确定无问题。

当我连接时,我得到一个带有httpResponse状态代码200的didReceiveResponse,我相信这是可以的。然后我得到一个connectionDidFinishLoading委托调用,但从来没有得到任何数据或错误。

这是我的连接代码:

- (BOOL)downloadFile:(NSString *)fileName:(int)fileId
{
    BOOL retVal = FALSE;

    NSString *strUrl = [NSString stringWithFormat:@"%@?id=%d&token=%@", FILE_URL,   fileId, accessToken];

    NSURL *myURL = [NSURL URLWithString:strUrl];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:myURL  cachePolicy:NSURLRequestReloadIgnoringLocalCacheData                                   timeoutInterval:60];


//  Starts the download
connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

return TRUE;
}

//这是响应代码:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;

    int code = [httpResponse statusCode];

    if(code <= 200)
    {
        [responseData setLength:0];
    }
    else
    {
        NSString *msg = [NSString stringWithFormat:@"Error Code: %d.  Download has Failed.", code];

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Download Error!"
                                                    message:msg
                                                   delegate:nil
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
        [alert show];
    }
}

//这是孤独的接收数据方法。永远不会被称为

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [responseData appendData:data];
}

//失败委托方法,不会被调用

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{

    NSString *msg = [NSString stringWithFormat:@"Error: %@", [error localizedDescription]];

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Download Error!"
                                                message:msg
                                               delegate:nil
                                      cancelButtonTitle:@"OK"
                                      otherButtonTitles:nil];
    [alert show];

}

就像我说它适用于Android和浏览器一样,如果我只是将网址指向该文件就可以下载了。

我被困住了,我感谢我能得到的任何帮助。

2 个答案:

答案 0 :(得分:0)

我想在你的第一个方法下载文件中再写两行:

- (BOOL)downloadFile:(NSString *)fileName:(int)fileId
{
    BOOL retVal = FALSE;

    NSString *strUrl = [NSString stringWithFormat:@"%@?id=%d&token=%@", FILE_URL,   fileId, accessToken];

    NSURL *myURL = [NSURL URLWithString:strUrl];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:myURL  cachePolicy:NSURLRequestReloadIgnoringLocalCacheData                                   timeoutInterval:60];


//  Starts the download
connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];


 if (connection) 
    {
        self.responseData = [NSMutableData data];
    }

return TRUE;
}

并将responseData对象的属性设置为非原子并保留在.h文件中并在ur .m文件中合成它。同时在ur dealloc中释放它,并在viewDidUnload中将其设为nil。

另外 我不知道你用ur方法调用什么类型的Web服务。但是有两种类型的Web服务GET和POST。你不能调用POST服务只在你的方法中将GET改为POST [request setHTTPMethod:@“POST”];

请尝试使用AFNetworking类或ASIHTTPRequest类 有一些Web服务的示例项目可以帮助您

用于AFNetworking:

https://github.com/AFNetworking/AFNetworking

http://mobile.tutsplus.com/tutorials/iphone/afnetworking-1-0/

http://afnetworking.com/

用于ASIHTTPRequest

http://allseeing-i.com/ASIHTTPRequest/

https://github.com/pokeb/asi-http-request

答案 1 :(得分:0)

原来这是服务器上的网址。在Apple文件夹而不是Android文件夹中设置了安全设置。