【问题标题】:AFNetworking file upload works with my php script but doesn't work with jsp scriptAFNetworking 文件上传适用于我的 php 脚本,但不适用于 jsp 脚本
【发布时间】:2011-11-07 18:52:26
【问题描述】:

我正在编写一个 iPhone 应用程序,它将一些信息(一些文本和图像)发送到服务器脚本。

使用我的 php 脚本一切正常,但使用我客户的 jsp 脚本(将收到的信息发送到电子邮件地址的电子邮件)没有任何效果...(我知道因为我应该收到自动回复电子邮件,而这没有不会发生)。

我无法访问我客户的脚本,因为他们是大客户并且“一些 bla bla 安全问题......” 该脚本适用于在线 Web 表单,并且适用于 iOS 4.3 上的 ASIHTTPRequest(我正在迁移到 AFNetworking,原因是 iOS 5 ASIHTTPRequest 不起作用)

非常感谢任何帮助!!!

这是我的代码...请注意,我的代码总是到达 NSLog(@"Success") 但我没有收到任何自动回复电子邮件,所以它不起作用!!

AFHTTPClient *client= [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://my.client.server.com"]];


    NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
    [parameters setObject:[fieldName text] forKey:@"field01_nome"];
    [parameters setObject:[fieldSurname text] forKey:@"field02_cognome"];



    NSMutableURLRequest *myRequest = [client multipartFormRequestWithMethod:@"POST" path:@"/Contents/mail/sendToForm.jsp" parameters:parameters constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) {
        [formData appendPartWithFileData:myNSDataToSend mimeType:@"image/jpeg" name:@"alleagto"];
    }];


    AFHTTPRequestOperation *operation = [AFHTTPRequestOperation HTTPRequestOperationWithRequest:myRequest success:^(id object) {
        NSLog(@"Success");

    } failure:^(NSHTTPURLResponse *response, NSError *error) {
        NSLog(@"Fail");

    }];


    [operation setUploadProgressBlock:^(NSInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) {
        NSLog(@"Sent %d of %d bytes", totalBytesWritten, totalBytesExpectedToWrite);

    }];

    queue = [[[NSOperationQueue alloc] init] autorelease];
    [queue addOperation:operation];

非常感谢!!

编辑:按照 JosephH 的建议,我添加了捕获的请求:

从在线 Web 表单生成的请求(始终有效):

POST /Contents/mail/sendToForm.jsp HTTP/1.1
Host: my.client.server.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/534.51.22 (KHTML, like Gecko) Version/5.1.1 Safari/534.51.22
Content-Length: 54246
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8  */<- added by me for syntax coloring
Origin: http://www.client.server.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryLWVo7zrkX3QOybWm
Referer: http://www.client.server.com/form/1/send-the-form.shtml
Accept-Language: it-it
Accept-Encoding: gzip, deflate
Pragma: no-cache
Connection: keep-alive

------WebKitFormBoundaryLWVo7zrkX3QOybWm
Content-Disposition: form-data; name="form_recipient"

4182fd0f318e1d86176a3be7f8c7d83955eb5eca2e1402250e47164caf1984e7
------WebKitFormBoundaryLWVo7zrkX3QOybWm
Content-Disposition: form-data; name="form_subject"


------WebKitFormBoundaryLWVo7zrkX3QOybWm
Content-Disposition: form-data; name="field01_nome"

Gianluca
------WebKitFormBoundaryLWVo7zrkX3QOybWm
Content-Disposition: form-data; name="field02_cognome"

Pisati
------WebKitFormBoundaryLWVo7zrkX3QOybWm
Content-Disposition: form-data; name="field03_indirizzo"

A
------WebKitFormBoundaryLWVo7zrkX3QOybWm
Content-Disposition: form-data; name="field04_provincia"

B
------WebKitFormBoundaryLWVo7zrkX3QOybWm
Content-Disposition: form-data; name="field05_email"

my_email@gmail.com
------WebKitFormBoundaryLWVo7zrkX3QOybWm
Content-Disposition: form-data; name="field06_telefono"

333
------WebKitFormBoundaryLWVo7zrkX3QOybWm
Content-Disposition: form-data; name="field07_tipo"

valore2
------WebKitFormBoundaryLWVo7zrkX3QOybWm
Content-Disposition: form-data; name="allegato"; filename="allegato.jpg"
Content-Type: image/jpeg

Here there's the attachment

------WebKitFormBoundaryLWVo7zrkX3QOybWm
Content-Disposition: form-data; name="field09_oggetto"

Test Web
------WebKitFormBoundaryLWVo7zrkX3QOybWm
Content-Disposition: form-data; name="field10_segnalazione"

Send Test Web
------WebKitFormBoundaryLWVo7zrkX3QOybWm--

使用 ASIHTTP 从 iOS 5.0 生成的请求(我不知道为什么,但有时它可以工作,有时则不行......)

POST /Contents/mail/sendToForm.jsp HTTP/1.1
Host: my.client.server.com
User-Agent: My App 1.0 (iPhone Simulator; iPhone OS 5.0; en_US)
Content-Length: 153522
Content-Type: multipart/form-data; charset=utf-8; boundary=0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Accept-Encoding: gzip
Connection: close

--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Content-Disposition: form-data; name="field01_nome"

Gianluca
--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Content-Disposition: form-data; name="field02_cognome"

Pisati
--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Content-Disposition: form-data; name="field03_indirizzo"

A
--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Content-Disposition: form-data; name="field04_provincia"

B
--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Content-Disposition: form-data; name="field05_email"

gianluca.pisati@gmail.com
--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Content-Disposition: form-data; name="field06_telefono"

333
--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Content-Disposition: form-data; name="field07_tipo"

valore2
--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Content-Disposition: form-data; name="field09_oggetto"

Test iOS 5
--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Content-Disposition: form-data; name="field10_segnalazione"

ASIHTTP on iOS 5
--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Content-Disposition: form-data; name="form_recipient"

4182fd0f318e1d86176a3be7f8c7d83955eb5eca2e1402250e47164caf1984e7
--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Content-Disposition: form-data; name="form_subject"


--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D
Content-Disposition: form-data; name="allegato"; filename="image.jpg"
Content-Type: image/jpeg

Here there's the attachment

--0xKhTmLbOuNdArY-ABC90FA4-3EE3-42FE-B93A-A698D7BB894D--

使用 AFNetworking 从 iOS 5.0 生成的请求(从不工作):

POST /Contents/mail/sendToForm.jsp HTTP/1.1
Host: my.client.server.com
User-Agent: com.mycompany.myapp/1.0 (unknown, iPhone OS 5.0, iPhone Simulator, Scale/1.000000)
Content-Length: 153203
Accept: */*                     */<- added by me for syntax coloring
Accept-Language: en, fr, de, ja, nl, it, es, pt, pt-PT, da, fi, nb, sv, ko, zh-Hans, zh-Hant, ru, pl, tr, uk, ar, hr, cs, el, he, ro, sk, th, id, ms, en-GB, ca, hu, vi, en-us;q=0.8
Accept-Encoding: gzip
Content-Type: multipart/form-data; boundary=Boundary+0xAbCdEfGbOuNdArY
Connection: keep-alive


--Boundary+0xAbCdEfGbOuNdArY
Content-Disposition: form-data; name="form_recipient"

4182fd0f318e1d86176a3be7f8c7d83955eb5eca2e1402250e47164caf1984e7
--Boundary+0xAbCdEfGbOuNdArY
Content-Disposition: form-data; name="field04_provincia"

B
--Boundary+0xAbCdEfGbOuNdArY
Content-Disposition: form-data; name="field05_email"

gianluca.pisati@gmail.com
--Boundary+0xAbCdEfGbOuNdArY
Content-Disposition: form-data; name="field07_tipo"

valore2
--Boundary+0xAbCdEfGbOuNdArY
Content-Disposition: form-data; name="field01_nome"

Gianluca
--Boundary+0xAbCdEfGbOuNdArY
Content-Disposition: form-data; name="field10_segnalazione"

AFNetworking on iOS 5
--Boundary+0xAbCdEfGbOuNdArY
Content-Disposition: form-data; name="field02_cognome"

Pisati
--Boundary+0xAbCdEfGbOuNdArY
Content-Disposition: form-data; name="form_subject"


--Boundary+0xAbCdEfGbOuNdArY
Content-Disposition: form-data; name="field06_telefono"

333
--Boundary+0xAbCdEfGbOuNdArY
Content-Disposition: form-data; name="field09_oggetto"

Test iOS 5
--Boundary+0xAbCdEfGbOuNdArY
Content-Disposition: form-data; name="field03_indirizzo"

A
--Boundary+0xAbCdEfGbOuNdArY
Content-Disposition: form-data; name="allegato"; filename="allegato-342447627.jpeg"
Content-Type: image/jpeg

Here there's the attachment

--Boundary+0xAbCdEfGbOuNdArY--

【问题讨论】:

    标签: objective-c afnetworking


    【解决方案1】:

    ASIHTTPRequest 在 iOS 5.0 上运行良好; 100 多个使用 ASIHTTPRequest 的应用在 iOS 5 上的问题为零。

    也就是说,从长远来看,迁移到 AFNetworking 可能是有意义的。

    这些“它可以在浏览器中工作,但不能用于”类型问题很难通过代码检查来解决 - 解决这些问题的最简单方法是安装 charlesproxy 之类的工具。

    安装后,开始捕获,然后在浏览器中执行请求,验证它是否成功,然后从 iOS 模拟器执行。然后将来自浏览器的请求与来自 AFNetworking 的请求进行比较,看看您能发现哪些差异。

    如果您无法弄清楚,请编辑您的问题以包含两个捕获的请求,我相信有人能够发现它。

    【讨论】:

    • 感谢您的建议..!!唯一改变的是参数的顺序,这可能是问题吗?我不这么认为......
    • 您确定这是唯一不同的地方吗?您是否比较了所有标题?如果这是唯一不同的地方,那肯定是问题所在——不过我相信还会有其他不同。
    • 好的,我添加了 3 个捕获的请求,第一个来自 Web 表单,第二个来自 ASIHTTP(有时在 iOS 5 中不起作用!我不知道为什么...),第三个是 AFNetworking
    • 您可以尝试使某些标题更加一致 - 例如。 Accept:、User-Agent:、Origin:、Referer:、Accept-Language 和其他一些在两个请求之间都是不同的。另外,您是否检查服务器是否正在向您发送任何内容?有时响应中可能会出现错误消息。
    【解决方案2】:

    AFNetworking 和 multipart/form-data 也有问题。解决了。当 AFNetworking 为 multipart/form-data 生成 HTTP 正文时,它会将 \r\n sumbols 放在开头。您的 AFNetworking 机构和其他机构之间的区别 - 开头是 \r\n。尝试删除它。我已经修改了一些 AFHTTPClient.m 方法以将它们从正文的开头删除:

    static inline NSString * AFMultipartFormEncapsulationBoundary() {
        return [NSString stringWithFormat:@"%@--%@%@", @""/*kAFMultipartFormLineDelimiter*/, kAFMultipartFormBoundary, kAFMultipartFormLineDelimiter];
    

    }

    和:

    - (void)appendPartWithHeaders:(NSDictionary *)headers body:(NSData *)body {
        [self appendString:AFMultipartFormEncapsulationBoundary()];
    
        for (NSString *field in [headers allKeys]) {
            [self appendString:[NSString stringWithFormat:@"%@: %@%@", field, [headers valueForKey:field], kAFMultipartFormLineDelimiter]];
        }
    
        [self appendString:kAFMultipartFormLineDelimiter];
        [self appendData:body];
        [self appendString:kAFMultipartFormLineDelimiter];
    

    }

    对我有用

    【讨论】:

      猜你喜欢
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多