почему мой файл не загружается с iPad на базу данных MySQL? - PullRequest
0 голосов
/ 03 апреля 2012

Я не знаю, в чем проблема в моем PHP-коде или на стороне target-c. Я не очень хорошо понимаю это, поэтому буду признателен за любую помощь в получении файлов для загрузки из приложения для iPad, которое я создаю, в базу данных mysql. В данный момент в базу данных помещается только описание файла, а blob / file - нет. Любая помощь будет высоко ценится!

Вот мой 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();
?>

Вот мой целевой код, упаковывающий его в 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]);

Спасибо, Rossi

1 Ответ

1 голос
/ 03 апреля 2012

Переменная $file['name'] - это имя файла, которое было опубликовано в загрузке (например, имя файла из локальной системы).

Переменная $file['tmp_name'] - это имя файла на сервере.Это имя файла, который содержит контент, который вы хотите поместить в базу данных.

Это должно относиться к стороне php.Код Objective-C немного сложнее.Вам необходимо вручную создать MIME-кодированный контент, который используется при загрузке.Существует простой пример для CocoaDev в методе generateFormData, в примере строки:

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

он устанавливает здесь PHP-эквивалент переменной $_FILE['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')");
}

Примечание также: если размер загружаемого вами файла превышает 64 КБ, вы должны указать Document в качестве типа поля MEDIUMBLOB.Обычный тип данных BLOB поддерживает только до 64K данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...