- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道这个问题被发布了很多次。我试图让我的代码工作,但找不到问题所在。请帮我。在我的应用程序中,用户拍了一张照片,这应该上传到网络服务器。
这是我的 iOS 代码:
NSData *data = UIImageJPEGRepresentation([UIImage imageNamed:@"oeffnungszeiten.jpg"], 1.0);
NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:BaseURLString parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
[formData appendPartWithFileData:data name:@"uploadedfile" fileName:_imageString mimeType:@"image/jpeg"];
} error:nil];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
NSProgress *progress = nil;
NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithStreamedRequest:request progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
if (error) {
NSLog(@"Error: %@", error);
} else {
NSLog(@"%@ %@", response, responseObject);
}
}];
[uploadTask resume];
这是我的 PHP 代码:
<?php
error_log("\n-->".$FILES["uploadedfile"]['name'], 3, "log.txt");
$target_path = "/";
$target_path = $target_path . basename( $_FILES['uploadedfile']['name']);
if (!$FILES["uploadedfile"]) {
error_log("\nleer", 3, "log.txt");
}
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
echo "The file ". basename( $_FILES['uploadedfile']['name']).
" has been uploaded";
error_log("The file ". basename( $_FILES['uploadedfile']['name']).
" has been uploaded", 3, "log.txt");
} else{
echo "There was an error uploading the file, please try again!";
error_log("There was an error uploading the file, please try again!", 3, "log.txt");
}
?>
你能找到我的错吗?没有图像发送到服务器!
最佳答案
几个想法:
有些服务器不处理chunked
请求。 (chunked
的 Transfer-encoding
传统上是一种将请求流式传输到服务器的方式,其中 Content-length
事先未知。)在 NSURLSession
中创建 chunked
请求的方法是在请求中使用 NSInputStream
而不是 NSData
或文件.
不幸的是,AFNetworking 总是使用 NSInputStream
技术(至少对于多部分请求),这意味着所有请求都使用 的
。不过,您可以在发出请求后,从 Transfer-encoding
流式传输到服务器>分块NSInputStream
创建一个 NSData
,从请求中删除 HTTPBodyStream
,然后使用上传使用 NSData
而不是流式请求的任务工厂方法。
NSMutableURLRequest *request = ... ; // create the request like you are now
// create `NSData` from the `NSInputStream`
NSMutableData *requestData = [NSMutableData data];
u_int8_t buffer[1024];
NSInteger length;
[request.HTTPBodyStream open];
do {
length = [request.HTTPBodyStream read:buffer maxLength:sizeof(buffer)];
if (length > 0)
[requestData appendBytes:buffer length:length];
} while (length > 0);
[request.HTTPBodyStream close];
// now that we have our `NSData`, we can remove `HTTPBodyStream` from request
request.HTTPBodyStream = nil;
request.HTTPBody = nil;
// instead of uploadTaskWithStreamedRequest, actually specify the `NSData` for the body of the request
NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request fromData:requestData progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
if (error) {
NSLog(@"Error: %@", error);
} else {
NSLog(@"%@ %@", response, responseObject);
}
}];
[uploadTask resume];
这确实有点低效(您可以通过将其流式传输到文件而不是 NSData
然后在上传任务中使用它来减少内存占用),但这是我唯一的方法知道强制 AFNetworking 不对多部分请求发出流式、分块
请求。因此,我建议仅在您的服务器不接受 chunked
请求时才进行此练习。
如果您的服务器发出身份验证质询,则 AFNetworking 中存在可能会给您带来问题的错误。 (如果您没有收到任何身份验证质询,则此错误不会为您显示出来,您不必为此担心。)
在 Charles 中查看此内容,我注意到 AFNetworking 在请求 header 中正确指定了边界,但是当在身份验证质询后重新发出的请求正文中使用边界时,正文部分的边界变为 nil
。这是因为 AFHTTPBodyPart
的 copyWithZone
中存在错误。我已经发布了 pull request可以解决这个问题。
如果您想通过转到 AFSerialization.h
并替换 AFHTTPBodyPart
的 copyWithZone
来在您的本地副本中修复此问题:
- (id)copyWithZone:(NSZone *)zone {
AFHTTPBodyPart *bodyPart = [[[self class] allocWithZone:zone] init];
bodyPart.stringEncoding = self.stringEncoding;
bodyPart.headers = self.headers;
bodyPart.bodyContentLength = self.bodyContentLength;
bodyPart.body = self.body;
return bodyPart;
}
与
- (id)copyWithZone:(NSZone *)zone {
AFHTTPBodyPart *bodyPart = [[[self class] allocWithZone:zone] init];
bodyPart.stringEncoding = self.stringEncoding;
bodyPart.headers = self.headers;
bodyPart.bodyContentLength = self.bodyContentLength;
bodyPart.body = self.body;
bodyPart.boundary = self.boundary;
return bodyPart;
}
我只是将 boundary
添加到复制对象时必须复制的属性列表中。
与您的原始问题无关,您有一行内容为:
NSData *data = UIImageJPEGRepresentation([UIImage imageNamed:@"oeffnungszeiten.jpg"], 1.0);
这个通过 UIImage
来回传输的过程不会返回与原始文件相同的对象。首先,考虑到您使用的品质因数为 1.0
,它可能比您的原始文件大得多。您还会剥离任何元数据(例如拍摄日期、使用的相机、相机设置等)。
如果这是您的意图,那很好,但通常您只需发送原始 JPEG:
NSURL *imageFileURL = [[NSBundle mainBundle] URLForResource:@"oeffnungszeiten" withExtension:@"jpg"];
NSData *data = [NSData dataWithContentsOfURL:imageFileURL];
关于php - AFNetworking 将 UIImage 上传为 NSData -> PHP 脚本移动文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22423092/
有没有人设法通过 AFNetworking 使服务器发送事件 (SSE) 正常工作?我知道 AFURLConnectionOperation 有一个可以附加到的 inputStream 属性,但是 A
在我使用 AFNetworking 发出网络请求之前,有没有办法取消所有网络请求(由另一种方法启动的请求) 我试过如下但不起作用: - (void)sendRequest:(NSUInteger)pa
我同时有一些请求,我想处理直到全部完成。以下是要求: [self getProfileData]; [self checkNewSystemMessage]; [self checkChatMessa
我需要执行一系列按顺序运行的服务器调用,并且只有在所有先前的请求都成功时才能执行一个请求。 所以,我的想法是为每个请求创建一个 AFHTTPRequestOperation 并使用 [myAFHTTP
我正在尝试将 AFNetworking 添加到我的项目中,但我认为我的静态库之一正在使用此框架。我的问题是我该怎么做(将 AFNetworking 添加到我的项目中,最好是不使用 pods)以及我如何
我正在尝试上传一个 NSData,它是使用 AFNetwork 的图像,但出了点问题,我找不到我的错误所在 这是我的代码: NSData *imageData = UIImageJPEGReprese
使用AFNetworking 2.0的应用程序遇到以下问题。 使用AFHTTPRequestOperationManager的GET方法时,出现错误NSURLErrorDomain code -101
你能帮我理解如何使用 UIActivityIndicatorView+AFNetworking 或 UIProgressView+AFNetworking 吗?我是否需要再创建一个 UIViewC
我一直在寻找新的 AFNetworking 2.0 的示例来上传图像。 但是我碰壁了,无法弄清楚代码有什么问题。 所以这是我使用的代码 NSData *imageData = UIImageJPEGR
寻找如何使用 AFHTTPClient 发布 json 的示例.我看到有一个 postPath 方法需要一个 NSDictionary并且 AFJSONEncode 方法返回一个 NSData .是否
在我的项目中,我有 RestKit 和 IDMPhotoBrowser(使用 Cocoapods),所以两个版本 AFNetworking 之间存在冲突。您知道如何在同一个项目中同时使用它们吗? 最佳
我正在尝试为 UIButton 集成 AFNetworking 类(我正在调用配置文件页面并加载异步用户的头像)。 https://gist.github.com/dpettigrew/2925847
我正在尝试将一个项目从 AFNetworking 1.3 迁移到 AFNetworking 2.0。 在 AFNetworking 1.3 项目中,我有以下代码: - (void) downloadJ
我正在使用 AFNetworking 2.0 & 新版本。成功尝试了几个示例 WS 调用。我们已经实现了 Web 服务并被称为: 它的数据参数是加密后的字符串。 请求是:http://demo.XYZ
我正在尝试使用 AFHTTPClient 方法“postPath”将一个参数键的多个值传递给 HTTP 请求。但是,参数变量是 NSDictionary,因此我无法为我的关键“电子邮件”设置多个值。我
当我想停止使用 AFNetworking 构建的同步引擎中的所有当前请求时,我真的遇到了问题。 我有 5 个不同的 URL 可以查询。如果前一个查询被正确执行,则每个查询都会启动。 这非常有效。 我想
我正在制作一个应用程序,它将从网络服务中获取图片资源和文本。我选择了很棒的 AFNetworking 的 UIImageView+AFNetworking 类别来处理图像下载的东西。 但是,我面临着内
我在使用 AFNetworking 时遇到问题代码: #import "SyncProfile.h" #import "AFNetworking.h" @implementation SyncProf
我使用 AFNetworking 作为我的 iPhone 应用程序的网络层,该应用程序连接到使用 Devise 进行身份验证的 Rails 服务器。如果我登录(通过 POST 调用)提供用户名/密码,
iOS 版 AFNetworking 是否提供了缓存失败请求(例如由于没有互联网连接)并在互联网连接恢复时自动重试请求的解决方案。 谢谢,多林 最佳答案 请参阅Network Reachability
我是一名优秀的程序员,十分优秀!