- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
早上好,我正在开发一个上传一些文件的应用程序;没有真正的问题,但只有一个大问题:如果我尝试上传 1GB 的文件,它会分配 1GB 的内存,你可以理解这不是一件好事。
这是我的代码:我将数据分配为 NSData,然后使用 NSMutableURLRequest + NSURLConnection 上传它们;我的问题是:有什么方法可以做到这一点而不需要分配整个内存?我已经搜索过,但什么也没找到...
_uploadDataFile是之前分配的NSData子类实例。
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://my.server/page"]
cachePolicy:NSURLRequestReloadIgnoringCacheData
timeoutInterval:60.0] autorelease];
NSData *dataFile;
if (_uploadDataFile == nil) {
NSError *error = nil;
dataFile = [[[NSData alloc] initWithContentsOfFile:@"pathToFile" options:NSDataReadingUncached error:&error] autorelease];
if (error) {
NSLog(@"Error %i: %@", [error code], [error localizedDescription]);
[self fermaUpload]; //Stop Upload
return;
}
}
else
dataFile = [_uploadDataFile file];
NSMutableDictionary *dictPost = [[[NSMutableDictionary alloc] init] autorelease];
[dictPost setValue:dataFile forKey:@"uploads[]"];
NSData *mutData = [self dataForPOSTWithDictionary:dictPost boundary:@"0194784892923" nomeFile:[@"pathToFile" lastPathComponent]];
NSString *postLength = [NSString stringWithFormat:@"%d", [mutData length]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"multipart/form-data; boundary=0194784892923" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:mutData];
[request setHTTPShouldHandleCookies:YES];
theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
这是 (NSData *)dataForPOSTWithDictionary:boundary:nomeFile: 方法的样子:
- (NSData *)dataForPOSTWithDictionary:(NSDictionary *)aDictionary boundary:(NSString *)aBoundary nomeFile:(NSString *)nomeFile {
NSArray *myDictKeys = [aDictionary allKeys];
NSMutableData *myData = [NSMutableData dataWithCapacity:1];
NSString *myBoundary = [NSString stringWithFormat:@"--%@\r\n", aBoundary];
for(int i = 0;i < [myDictKeys count];i++) {
id myValue = [aDictionary valueForKey:[myDictKeys objectAtIndex:i]];
[myData appendData:[myBoundary dataUsingEncoding:NSUTF8StringEncoding]];
//if ([myValue class] == [NSString class]) {
if ([myValue isKindOfClass:[NSString class]]) {
[myData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", [myDictKeys objectAtIndex:i]] dataUsingEncoding:NSUTF8StringEncoding]];
[myData appendData:[[NSString stringWithFormat:@"%@", myValue] dataUsingEncoding:NSUTF8StringEncoding]];
} else if(([myValue isKindOfClass:[NSURL class]]) && ([myValue isFileURL])) {
[myData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", [myDictKeys objectAtIndex:i], [[myValue path] lastPathComponent]] dataUsingEncoding:NSUTF8StringEncoding]];
[myData appendData:[[NSString stringWithFormat:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[myData appendData:[NSData dataWithContentsOfFile:[myValue path]]];
} else if(([myValue isKindOfClass:[NSData class]])) {
[myData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", [myDictKeys objectAtIndex:i], nomeFile] dataUsingEncoding:NSUTF8StringEncoding]];
[myData appendData:[[NSString stringWithFormat:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[myData appendData:myValue];
} // eof if()
[myData appendData:[[NSString stringWithString:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
} // eof for()
[myData appendData:[[NSString stringWithFormat:@"--%@--\r\n", aBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
return myData; } // eof dataForPOSTWithDictionary:boundary:
谢谢你,对我的英语感到抱歉。
最佳答案
一个最有趣的问题!有两种方法可以将正文数据输入 NSURLConnection/Request
:
NSData
NSInputStream
不幸的是,这也不是你想要的开箱即用的东西,因为你想要上传一个文件+一些表单数据。理想情况下,您可以子类化 NSInputStream
以提供您需要的格式化数据。但是,我上次检查时,NSURLConnection
无法处理此类子类。相反,请执行以下操作:
CFStreamCreateBoundPair()
创建一对流。这将返回一个 CFWriteStream
和 CFReadStream
,它们分别免费桥接到 NSOutputStream
和 NSInputStream
-setHTTPBodyStream:
在带有输入流的 URL 请求上现在应该定期调用输出流的委托(delegate)来请求数据。您需要输入 POST 数据,然后输入文件数据 block 。因此整个文件永远不会同时完全存在于内存中。
关于macos - NSMutableURLRequest 和内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7793311/
基本上,我想实现SYNC功能;如果互联网连接不可用,数据将存储在本地 sqlite 数据库中。只要互联网连接可用,SYNC 就会开始工作。 现在,举个例子;本地存储5条记录,然后可以连接互联网。我想更
我创建 NSMutableUrlRequest 用于将数据发送到服务器,向其中添加所有必需的字段,然后添加用于发送的字符串,如下所示: [theRequest setHTTPBody:[postStr
早上好,我正在开发一个上传一些文件的应用程序;没有真正的问题,但只有一个大问题:如果我尝试上传 1GB 的文件,它会分配 1GB 的内存,你可以理解这不是一件好事。 这是我的代码:我将数据分配为 NS
我需要在 WebView 中通过 POST 发送大量数据(图像文件),因此我将 NSMutableURLRequest 与 setHTTPBody: 结合使用>. 问题:如果数据大小超过 3MB,应用
当设置 NSMutableURLRequest 的“授权” header 时,我的服务器对 header 的响应不包括该 header : [Host] => myhost.com [Content-
我正在使用xcode 5.1.1对我的iOS项目进行逻辑单元测试 对于下面的代码,NSLog的输出两次都是“Handles cookies NO”: NSMutableURLRequest *newR
Apple 的 iOS 文档 NSMutableURLRequest说: NSURLConnection makes a deep copy of each NSMutableURLRequest o
在您阅读本文之前,请记住我是一名 Objective C 程序员,正试图帮助一位对我的工作一无所知的 C# 程序员调试服务器问题。 我正在向 .net/c# 端发送一个 SOAP 数据包,服务器接收到
我尝试将 NSMutableURLRequest 的请求超时设置为 120,但它被忽略。请求超时在 90 秒内失败。谁能告诉我如何设置 NSMutableURLRequest 的请求超时? .我浏览了
我正在使用 NSMutableURLRequest 向服务器发出 HTTP 请求。现在,由于网络缓慢,需要一些时间才能获得响应,在这期间我想从我的应用程序注销。由于在注销之前已经向服务器发送了多个请求
我有一个带有 webservice 的字符串。但是当我将字符串添加到 NSMutableRequest 时,方法返回变为 null。这是我的代码, -(NSMutableURLRequest *)cr
NSString *url = [NSString stringWithFormat: @"http://apis.haoservice.com/weather?cityname=%@&key=%@"
我收到一条错误消息,提示“参数标签'(URL:, cachePolicy:, timeoutInterval:)' 不匹配任何可用的重载”,我不知道如何解决这个问题,有人知道吗?我正在使用 Swift
我有子类 NSMutableURLRequest 如下: class CustomNSMutableURLRequest: NSMutableURLRequest { convenience
我有 2 个独立的 NSOperationQueues,其中并行处理两个不同的 Web 服务操作。对于这两个 Web 服务,超时间隔都设置为 120 秒(2 分钟)。这两个 Web 服务在 Inter
我想向 NSMutableURLRequest 添加额外的字段(例如 NSString 值 requestID),以便在 时确定请求的正确处理程序>NSURLSession 完成它。 创建自定义 NS
我正在使用 NSMutableURLRequest 将 base64 编码的图像作为发布请求的一部分发送到服务器。我作为帖子正文记录的内容和服务器收到的内容不是一回事。服务器似乎得到了一个截断的版本,
如何使用 NSLog 打印 NSMutableURLRequest ? 最佳答案 .allHTTPHeaderFields 返回带有标题内容的字典: NSLog(@"%@", [request all
我尝试制作一个登录页面以使用户对网站进行身份验证。我尝试过类似的事情: NSURL *myURL = [NSURL URLWithString:@"https://www.freelancer
我正在尝试使用以下方法实现下载恢复功能setValue:forHTTPHeaderField。但每当我使用该方法时,我都会得到一个 [NSURLRequest setValue:forHTTPHead
我是一名优秀的程序员,十分优秀!