Iphone 上载带有ASIFormDataRequest的文件无效
我正在使用ASIHTTPRequest框架,试图通过iPhone将文件上传到我的网站。 下面是代码。只要我不使用setFile方法,我就会从服务器得到一个200,所以一切都很好。一旦我实现setFile,服务器就会返回0。我希望有一个401或类似的计划,因为我可以想象我处理的是一个身份验证问题。 我的服务器是IIS,为什么我在请求中使用NTLM方式。我错过什么了吗Iphone 上载带有ASIFormDataRequest的文件无效,iphone,file-upload,upload,asihttprequest,Iphone,File Upload,Upload,Asihttprequest,我正在使用ASIHTTPRequest框架,试图通过iPhone将文件上传到我的网站。 下面是代码。只要我不使用setFile方法,我就会从服务器得到一个200,所以一切都很好。一旦我实现setFile,服务器就会返回0。我希望有一个401或类似的计划,因为我可以想象我处理的是一个身份验证问题。 我的服务器是IIS,为什么我在请求中使用NTLM方式。我错过什么了吗 NSInteger httpStatus; NSString *httpResponseString; NSError *httpR
NSInteger httpStatus;
NSString *httpResponseString;
NSError *httpRequestError;
NSArray *paths = [[[NSArray alloc] init] autorelease];
paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filename = [documentsDirectory stringByAppendingPathComponent:@"abiliator_basis_de_ar.xml"];
NSURL *myURL = [NSURL URLWithString: @"http://my.url.com/"];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:myURL];
[request setShouldPresentCredentialsBeforeChallenge:NO];
[request setUsername:@"myUserName"];
[request setPassword:@"myPassword"];
[request setDomain:@"myDomainName"];
[request setFile:[NSURL URLWithString:filename] forKey:@"xml"];
[request startSynchronous];
httpRequestError = [request error];
httpResponseString = [request responseString];
httpStatus = [request responseStatusCode];
if (!httpRequestError) {
httpStatus = [request responseStatusCode];
NSLog(@"Class %@, Method: %@ - OK login and filetransfer successful '%i'", self.myClassName, NSStringFromSelector(_cmd), httpStatus);
}
else {
NSLog(@"Class %@, Method: %@ - Error '%i' occurred sending the http request", self.myClassName, NSStringFromSelector(_cmd), httpStatus);
}
是,文件存在,这里是ls的结果:
rene-stegs-macbook-pro:~ renesteg$ ls -ltr '/Users/renesteg/Library/Application Support/iPhone Simulator/5.1/Applications/417BD791-64BC-48D0-B519-F10C7F617E36/Documents/abiliator_basis_de_ar.xml'
-rw-r--r--@ 1 renesteg staff 1062 22 Mai 13:44 /Users/renesteg/Library/Application Support/iPhone Simulator/5.1/Applications/417BD791-64BC-48D0-B519-F10C7F617E36/Documents/abiliator_basis_de_ar.xml
这里是filename的值:
Filename string is: '/Users/renesteg/Library/Application Support/iPhone Simulator/5.1/Applications/417BD791-64BC-48D0-B519-F10C7F617E36/Documents/abiliator_basis_de_ar.xml
上载文件时,您做错了什么 它需要像这样
NSFileManager *fileManager = [NSFileManager defaultManager];
request = [[[ASIFormDataRequest alloc] initWithURL:url] autorelease];
[request setRequestMethod:@"POST"];
[request setTimeOutSeconds:120];
[request setPostFormat:ASIMultipartFormDataPostFormat];
[request addRequestHeader:@"Content-Type" value:@"multipart/form-data"];
if ([fileManager fileExistsAtPath:filePath] == YES) {
[request setFile:filePath withFileName:@"test.xml" andContentType:@"xml" forKey:@"FieldName"];
}
这里需要为fromdata请求设置文件路径
希望这对您有用。您可能应该尝试使用setdata:forKey:并发送xml文件的数据,如下例
.....
NSURL *myURL = [NSURL URLWithString: @"http://my.url.com/"];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:myURL];
[request setShouldPresentCredentialsBeforeChallenge:NO];
[request setUsername:@"myUserName"];
[request setPassword:@"myPassword"];
[request setDomain:@"myDomainName"];
[request setData:[NSData dataWithContentsOfFile:fileName] forKey:@"xml"];
[request startSynchronous];
.....
此外,您可能应该将此请求设置为
异步请求。我认为出现错误是因为您应该使用:
[request setFile:[NSURL fileURLWithPath:filename] forKey:@"xml"];
好的,问题出在Neels注释行之间:缺少PHP。
这当然需要在URL中调用,因此构建URL的正确方法是:
NSURL *myURL = [NSURL URLWithString: @"http://my.url.com/upload.php"];
通过这种方式,我得到了iPhone httpRequest代码和PHP的映射
以下是所需的PHP代码:
<?php
$target = "upload/";
$target = $target . basename( $_FILES['xml']['name']) ;
$ok=1;
if(move_uploaded_file($_FILES['xml']['tmp_name'], $target))
{
echo "The file ". basename( $_FILES['xml']['name']). " has been uploaded";
}
else {
echo "Error uploading". basename( $_FILES['xml']['name']). " occured";
}
?>
Thx,麦肯。请参阅我的文章的编辑。[NSURL URLWithString:filename]也是有效对象还是无效?谢谢,但仍然是相同的错误。检查文件是否存在的良好实践应该包括这一点。不过,其余部分与我编写的代码没有太大区别。我仍然相信我必须在服务器上配置一些东西,并且代码实际上是可以的。我已经设置了文件测试,如果不存在文件,但是我已经改变了方法,不管你以前使用什么。只需与PHP开发人员确认您正在使用正确的参数进行上传。。。我已经改变了我的答案,我希望现在它能起作用……尼尔,我想你刚才提到了关键点:PHP。这似乎不见了。我实际上有一个PHP代码,可以将文件复制到正确的目录。你知道,我需要把那个PHP文件称为什么,或者在哪里映射它吗?