2012-04-02 3 views
0

문제점이 PHP 코드 또는 objective-c면에 있는지 알 수 없습니다. 나는 이것을 아주 잘 이해하지 못하므로, MySQL 데이터베이스에 생성하고있는 iPad 앱에서 업로드 할 파일을 얻는 데 도움이 될 것입니다. 지금은 파일에 대한 설명 만 데이터베이스에 게시되지만 BLOB/파일은 게시되지 않습니다. 어떤 도움을 많이 주시면 감사하겠습니다! 여기 내 파일이 iPad에서 MySQL DB로 업로드되지 않는 이유는 무엇입니까?

<?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(); 
?> 

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']가있는 HTTP 패킷으로 포장, 내 목표 - C 코드입니다 : 여기

내 PHP 코드 업로드에 게시 된 파일의 이름 (예 : 로컬 시스템의 파일 이름).

변수 $file['tmp_name']은 서버에있는 파일의 이름입니다. 이것은 데이터베이스에 넣으려는 내용이 들어있는 파일의 이름입니다.

PHP 쪽을 처리해야합니다. Objective-C 코드는 좀 더 복잡합니다. 업로드시 사용되는 MIME 인코딩 된 콘텐츠를 수동으로 생성해야합니다. generateFormData 방법에 CocoaDev에 simple example이 라인의 예에서,있다 : 그는 귀하의 경우, 여기에 $_FILE['file1'] 변수의 PHP에 상응를 설정하는 것입니다

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

, 당신은 아마 대신 forKey:@"file"을 선택합니다.

편집 독립형 동기식 변형입니다. 다음 매개 변수가 있습니다 : DestUrl - 대상을 포함하는 NSURL, fileName - 파일 이름을 포함하는 NSString이고 마지막으로 FileData, 파일의 내용이 들어있는 NSData입니다.

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보다 큰 경우 다음 MEDIUMBLOB의 필드 유형으로 Document을 지정해야합니다. 일반 BLOB 데이터 형식은 64K 데이터 만 지원합니다.

+0

감사합니다. 나는 그 주사를 내 줬습니다. 제 편집 내용을 보았지만 주사위는 없었습니다. 나는 db에있는 파일의 이름을 얻었습니다. – Rossi

+0

그의 generateFromData 메서드를 사용하고 제안 된대로 코드를 수정했습니다. 편집 내용은 위에 나와 있습니다. 여전히 작동하지 않지만 정말로 도움을 주셔서 감사합니다! 틀린 다른 것을 본 적이 있습니까? – Rossi

+0

당신은 정말 영웅입니다. 심각하게. 모든 도움을 주셔서 감사합니다! 정말 고맙습니다! 그것은 작동하고 정말 대단합니다. – Rossi

관련 문제