2012-04-02 105 views
0

我不知道问题出在我的PHP代码还是在objective-c方面。我不明白这一点,所以将不胜感激任何帮助获取文件从我创建到MySQL数据库的iPad应用程序上传。现在,只有文件的描述被发布到数据库中,但blob /文件不是。任何帮助将非常感激!为什么我的文件没有从iPad上传到MySQL DB?

这是我的PHP代码:

<?php 
$username = "person"; 
$password = "xxxxxxx"; 
$database = "database"; 

mysql_connect(localhost,$username,$password); 
mysql_select_db($database) or die("Unable to select database"); 

$file = $_FILES['file']; 
$name = $file['tmp_name']; 
$testpage = file_get_contents($name); 
$testpage = mysql_real_escape_string($testpage); 

mysql_query("INSERT INTO tbldocs(Title,Document) VALUES('some title','$testpage')");    
mysql_close(); 
?> 

这是我的目标c代码,包装成一个HTTP分组

NSMutableDictionary* post_dict = [[NSMutableDictionary alloc] initWithCapacity:2]; 
[post_dict setObject:@"test_value" forKey:@"test_key"]; 
[post_dict setObject:[NSURL fileURLWithPath:[pdfUrl absoluteString]] forKey:@"file"]; 
NSData* regData = [self generateFormData:post_dict]; 
[post_dict release]; 

NSMutableURLRequest* post = [NSMutableURLRequest requestWithURL: [NSURL URLWithString:@"http://myserver/upload.php"]]; 
[post addValue: @"multipart/form-data; boundary=_insert_some_boundary_here_" forHTTPHeaderField: @"Content-Type"]; 
[post setHTTPMethod: @"POST"]; 
[post setHTTPBody:regData]; 
NSURLResponse* response; 
NSError* error; 
NSData* result = [NSURLConnection sendSynchronousRequest:post returningResponse:&response error:&error]; 
NSLog(@"%@", [[[NSString alloc] initWithData:result encoding:NSASCIIStringEncoding] autorelease]); 

谢谢, 罗西

回答

1

可变$file['name']是在上传中发布的文件的名称(例如本地系统的文件名)。

变量$file['tmp_name']是服务器上文件的名称。这是包含要放入数据库的内容的文件的名称。

这应该解决php方面。 Objective-C代码稍微复杂一些。您需要手动构建上传中使用的mime编码内容。有上CocoaDev一个simple example在generateFormData方法,在线路例如:

[post_dict setObject:[NSURL fileURLWithPath:@"/Butterfly.tif"] forKey:@"file1"]; 

他在这里设置PHP相当于$_FILE['file1']可变的,你的情况,你可能想选择forKey:@"file"代替。

编辑自包含的同步变体。我有以下参数:DestUrl - 包含目标的NSURL,fileName - 包含文件名称的NSString,最后是包含文件内容的NSData(包含文件内容的NSData)FileData

NSMutableData *data = [[NSMutableData alloc] initWithCapacity:100]; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:DestUrl]; 
[request setHTTPMethod:@"POST"]; 
// Define the boundary 
NSString *boundary = [NSString stringWithFormat:@"weasel_grapple_%ld_foo", (long)time(NULL)]; 
// Tell MIME that content type 
[request addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary] 
    forHTTPHeaderField:@"Content-Type"]; 
// First piece of data 
[data appendData:[[NSString stringWithFormat:@"--%@\n", boundary] dataUsingEncoding:NSASCIIStringEncoding]]; 
// Add in the form field name (name), filename 
[data appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\n", 
        @"file", fileName] dataUsingEncoding:NSASCIIStringEncoding]]; 
// And it's binary data here 
[data appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\n\n"] dataUsingEncoding:NSASCIIStringEncoding]]; 
// This is content of the file 
[data appendData:FileData]; 
// Need a blank link as a separator of form-data items 
[data appendData:[[NSString stringWithString:@"\n"] dataUsingEncoding:NSASCIIStringEncoding]]; 
// Mark the end of the upload message 
[data appendData:[[NSString stringWithFormat:@"--%@--\n", boundary] dataUsingEncoding:NSASCIIStringEncoding]]; 

[request setHTTPBody:data]; 

NSURLResponse *response; 
NSError *error; 
NSData *retData = [NSURLConnection sendSynchronousRequest:request 
              returningResponse:&response 
               error:&error]; 

如果你想利用一个文件的URL,并把它变成的FileData然后执行: 的NSData *的FileData = [NSData的dataWithContentsOfFile:fileURL]。

在PHP方面,首先用一个简单的上传表单进行测试,确保上传的数据正在进入数据库并从那里开始工作。

我的php文件上传到数据库的片段看起来像。这是非常可怕的,但它得到跨线:

foreach ($_FILES as $key => $value) { 
    $file_tag = $key; 
    $fname = basename($value['name']); 
    $name = $value['tmp_name']; 

    $testpage = file_get_contents($name); 
$testpage = addslashes($testpage); 

    mysql_query("INSERT INTO tbldocs(Title,Document) VALUES('some title','$testpage')"); 
} 

还要注意上传:如果您上传的文件大于64K,那么你必须指定Document作为一个字段类型的MEDIUMBLOB。常规的BLOB数据类型最多只支持64K数据。

+0

谢谢,我给了一个镜头 - 看到我的编辑,但仍然没有骰子...我得到的是数据库中的文件的名称。 – Rossi 2012-04-02 21:23:27

+0

我使用他的generateFromData方法,并按照您的建议修改了我的代码。上面显示的编辑。它仍然不起作用,但我真的很感谢你的帮助!你碰巧看到其他可能错误的东西吗? – Rossi 2012-04-02 22:01:43

+0

你严重地是我的英雄。认真对待。感谢您的帮助!我真的很感激它!它的工作原理真的很棒。 – Rossi 2012-04-04 05:05:45

相关问题