Размеры файлов с сервера и приложения не совпадают? - PullRequest
1 голос
/ 09 апреля 2011

У меня есть приложение для загрузки изображений, которое я хочу убедиться, что пользователь загружает изображение без частичного (поврежденного) изображения, если оно падает или закрывается во время загрузки.

Первой моей мыслью было проверить размеры файлов на сервере, чтобы увидеть, совпадает ли размер файла. Вот мой код OBJECTIVE-C:

NSString *jpgPath = [NSString stringWithFormat:@"Documents/%@",sqlImageUploadPathTwo];
NSString *yourPath = [NSHomeDirectory() stringByAppendingPathComponent:jpgPath];
NSFileManager *man = [[NSFileManager alloc] init];
NSDictionary *attrs = [man attributesOfItemAtPath: yourPath error: NULL];
int result = [attrs fileSize];
NSLog(@"Initial size: %d", result);

А вот мой код PHP:

$file_size = $_FILES['userfile']['size'];

После их регистрации я вижу, что они кажутся разными числами (но они несколько близки). Я получил 337534 из приложения для iPhone и 349632 с сервера.

Почему эти цифры не совпадают? Какой будет моя лучшая альтернатива?

Спасибо!
Коултон

EDIT:

Вот код для моей загрузки:

UIImage *tempImage = [UIImage imageNamed:jpgPathTwo];
NSLog(@"tempImage: %@", tempImage);
NSData *imageData = UIImageJPEGRepresentation(tempImage, 90);

NSString *urlString = [NSString stringWithFormat:@"http://myflashpics.com/iphone_processes/upload.php?album=%@&id=%@&caption=%@&orient=%@",getAlbumID,theUserID,theCaption,getOrientation];

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];
NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"];
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
[request addValue:contentType forHTTPHeaderField:@"Content-Type"];

NSMutableData *body = [NSMutableData data];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"userfile\"; filename=\".jpg\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[NSData dataWithData:imageData]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:body];

NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];

А вот немного PHP:

// Start Uploading...
$uploadDir = "./../users/$get_username/pictures/";
$file = basename($_FILES['userfile']['name']);
$uploadFile = $file;
$newName = $uploadDir . $new_id . $uploadFile;
$file_size = $_FILES['userfile']['size'];

if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
// Some code to process and make MYSQL queries
}

РЕДАКТИРОВАТЬ 2:

Вот таблица некоторых успешных загрузок изображений:

Size on app - Size on server
337534      - 349632
390995      - 396789
171797      - 176577
171042      - 179143

Извините, это была загрузка того же изображения. Только что обновил результаты.

Редактировать 3:

PHP-код для выполнения MD5 HASH:

// I've tried this:
md5("$tmp_location");
// And this:
md5_file("$tmp_location");

Код приложения для iPhone:

CFStringRef md5hash = FileMD5HashCreateWithPath((CFStringRef)yourPath, FileHashDefaultChunkSizeForReadingData);
NSLog(@"MD5 hash of file at path \"%@\": %@", yourPath, (NSString *)md5hash);
CFRelease(md5hash);

(using this: http://www.joel.lopes-da-silva.com/2010/09/07/compute-md5-or-sha-hash-of-large-file-efficiently-on-ios-and-mac-os-x/)

Ответы [ 2 ]

2 голосов
/ 09 апреля 2011

Альтернативой является хеш MD5.Это, вероятно, лучшая альтернатива.

Как вы загружаете изображения?Не могли бы вы предоставить фрагмент кода?

1 голос
/ 09 апреля 2011

Редактировать: новый ответ

Полагаю, размеры файлов разные, потому что просто загружают разные данные.

Вы не загружаете файл как он сохранен:

UIImage *tempImage = [UIImage imageNamed:jpgPathTwo];
NSLog(@"tempImage: %@", tempImage);
NSData *imageData = UIImageJPEGRepresentation(tempImage, 90);

imageData не обязательно будет таким же, как на диске.

Почему бы не использовать данные с диска напрямую? Вместо этого используйте [NSData dataWithContentsOfFile:imagePath];.

Старый ответ с учетом кодировки

Кажется, что ваша кодировка неправильная - это обычно дает немного несоответствующие данные.

Я не пробовал, но предложил бы использовать binary вместо application/octet-stream. Если это не решит проблему, возможно, сбережения на стороне сервера ошибаются.

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