0

我正在尝试从我的 iOS 应用程序中的 PHP 服务下载文件。我使用来自 Android 和浏览器的相同 PHP 服务,并且服务器部分工作正常。我可以在浏览器中测试 url 并提示下载文件,就像你期望的那样。如果我将 url 直接指向我的 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 和浏览器上运行,如果我只是将 url 指向文件,它会很好地下载。

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

4

2 回答 2

0

原来是服务器上的url。在 Apple 文件夹而非 Android 文件夹上设置了安全设置。

于 2013-10-02T14:20:25.720 回答
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 文件中,并在您的 .m 文件中合成。也可以在你的 dealloc 中释放它,并在 viewDidUnload 中使其为零。

另外我不知道你用你的方法调用什么类型的网络服务。但是有两种类型的网络服务 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

于 2013-01-12T21:17:45.703 回答