objective-c - ASIHTTPRequest:一个(潜在的)特定于运营商的问题,同时上传数据/服务器收到空白 POST

标签 objective-c asihttprequest

使用 ASIFormDataRequest 将文件上传到服务器时出现(对我而言)非常奇怪的问题。

用WiFi上传的时候没问题,我可以上传就好了。使用 O2 UK 作为运营商通过 3G 上传时,也没有问题。当我使用 Vodafone UK 使用完全相同的代码上传到同一服务器时,HTTP 请求到达服务器时 POST 内容被删除。如果我尝试相同的请求但没有上传图像(只需添加 test=>yes 作为一些 POST 数据),那么这将起作用,但如果我有 test=>yes 并附加一个文件,它会通过 POST 到达服务器数据被剥离。

注意我在 iPhone 4S 上使用最新版本的 ASIHTTPRequest,它可以在其他几部使用 Vodafone UK 和 O2 UK 的手机上重现。

因此,我将我的 objc 代码指向以下 PHP 脚本,它只打印出它收到的内容:

<?php
error_reporting(E_ALL);
ini_set("display_startup_errors","1");
ini_set("display_errors","1");

echo "FILES: ".print_r($_FILES,true);
echo "POST: ".print_r($_POST,true);
echo "GET: ".print_r($_GET,true);

die('done.');

我使用的 obj-c 代码是:

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSURL *url = [NSURL URLWithString: @"http://myserver.com/debugger.php"];
    ASIFormDataRequest *request = [[ASIFormDataRequest alloc] initWithURL:url];

    [request setDelegate:self];
    [request setDidFinishSelector:@selector(networkRequestSuccess:)];
    [request setDidFailSelector:@selector(networkRequestFailure:)];
    [request setTimeOutSeconds:120];

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"smalltestimage" ofType:@"png"];  
    NSData *myData = [NSData dataWithContentsOfFile:filePath];  
    if (myData) {  
        [request addPostValue:@"Yes" forKey:@"Test"];
        [request addData:myData withFileName:@"smalltestimage.png" andContentType:@"image/png" forKey:@"photos"];
        [request startSynchronous];
    } 
    else{
        NSLog(@"File not found..");
    }

    [request autorelease];
}

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

    NSLog(@"Success Response: %@", [request responseString]);

}

- (void)networkRequestFailure:(ASIHTTPRequest *)request{
    NSLog(@"Fail Response: %@", [request responseString]);
}

如果我在启用 WiFi 的情况下或在 O2 UK 上运行该应用程序,我会收到以下响应:

Success Response: FILES: Array
(
    [photos] => Array
        (
            [name] => smalltestimage.png
            [type] => image/png
            [tmp_name] => /tmp/phpYTdw4g
            [error] => 0
            [size] => 13211
        )

)
POST: Array
(
    [Test] => Yes
)
GET: Array
(
)
done.

到目前为止一切顺利!

如果我在禁用 WiFi 的情况下重试,但 Vodafone UK 上的 3G 信号几乎全:

Success Response: FILES: Array
(
)
POST: Array
(
)
GET: Array
(
)
done.

非常奇怪:现在不仅文件丢失了,而且“测试”POST 值也丢失了。但是,PHP 或 ASIHTTPRequest 都没有错误。

任何人都可以为我阐明什么吗?如果沃达丰正在操纵这样的东西,为什么它不为人所知呢?我能找到的唯一一个报告类似问题的人 posted a year ago .

如果我注释掉 [request addData] 行,那么它会完美运行:

Success Response: FILES: Array
(
)
POST: Array
(
    [Test] => Yes
)
GET: Array
(
)
done.

很奇怪。我一直在努力让这个工作一整天,但到目前为止没有运气。如果有人能提供任何线索,或者只是遇到同样的问题,我将不胜感激。

最佳答案

哇。太疯狂了。对我来说,这听起来像是一个损坏的 HTTP 代理。您是否有机会使用 HTTPS 来尝试防止代理弄乱您的数据?

您也可以尝试定义 DEBUG_REQUEST_STATUS(在 ASIHTTPRequest.m 中使用)来查看,例如,您是否获得了一个正在丢弃您的 POST 正文或其他内容的重定向。

关于objective-c - ASIHTTPRequest:一个(潜在的)特定于运营商的问题,同时上传数据/服务器收到空白 POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8195200/

相关文章:

ios - 1 < -1 的计算结果为 TRUE

ios - 如何将所有文件从 NSDocumentDirectory 移动到 NSCachesDirectory?

iphone - 如何避免 iPhone 中的 Web 服务(ASIHTTPRequest)响应延迟?

iphone - 频繁asihttprequest runrequests crash

iphone - ASIHTTPRequest - 设置忽略缓存/代理

objective-c - 多个 UIView 动画

ios - 自定义 transitionFromViewController 抛出错误

ios - ASIHTTPRequest 获取请求 - 未调用委托(delegate)

ios - 使用 Twitter 在 iPhone 中登录用户并将经过身份验证的用户保存到远程 Django 应用程序

ios - Objective-C 主题标签/标签自动完成实现