2015-09-19 2 views
2

Я новичок в работе с изображениями jpeg таким образом, но до сих пор удалось: получить приложение iPad для отправки изображения в базу данных SQL; получить страницу php для чтения сохраненных данных и отображения изображения. Тем не менее, я также пытаюсь прочитать заголовок, который, как я думал, должен содержать photoID (отправляется с использованием сценария Xcode, показанного ниже)Чтение заголовков jpeg

Я использую этот код для чтения заголовков, но я не понимаю, что происходит. Это проверяет изображение в базе данных, и изображение отображается (так что я знаю, что у меня есть изображение), но он говорит Нет данных заголовка. Это правда? Я думал, что сценарий, используемый для создания тела HTTP, отправленного из Xcode, включает информацию заголовка.

$select = "SELECT * FROM tblPhotos"; 
$result = mysqli_query($link, $select); 

while($row = mysqli_fetch_array($result)) 
{ 
$img=base64_encode($row['photoData']); 
echo "<img src=\"data:image/jpg;charset=utf8;base64, $img\"/>"; 
echo "<br>"; 

$exif = exif_read_data($img, 0, true); 
echo $exif === false ? "No header data found.<br />\n" : "Image contains headers<br />\n"; 


} 

Xcode script, который отправляет изображение в базу данных.

NSMutableData *body = [NSMutableData data]; 
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"image\"; filename=\"%@.jpg\"\r\n", photoID] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"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]]; 
[photoRequest setHTTPBody:body]; 

UPDATE:

Я также попытался следующие, это сказать, что у меня есть заголовки. Однако заголовки не отображаются с помощью цикла foreach, а vardump ($ exif) дает мне NULL.

while($row = mysqli_fetch_array($result)) 
{ 
$img = base64_encode($row['photoData']); 
echo "<img src=\"data:image/jpg;charset=utf8;base64, $img\"/>"; 
echo "<br>"; 

$temp = tmpfile(); 
fwrite($temp, $row['photoData']); 
$exif = exif_read_data($temp, 0, true); 
echo $exif !== false ? "Image contains headers.<br />\n" : "No header data found.<br />\n"; 
vardump($exif); 

foreach ($exif as $key => $section) 
{ 
    foreach ($section as $name => $val) 
    { 
    echo "$key.$name: $val<br />\n"; 
    } 
} 

fclose($temp); 

} 
+1

Вы просмотрели документацию ['exif_read_data()') (http://php.net/manual/en/function.exif-read-data.php)? Довольно ясно, что вы передаете строку base64, где PHP ожидает имя файла. Кроме того, я думаю, вы имеете в виду ваш код Objective-C; Xcode - это IDE. –

+0

Я прочитал документы (вот где я получил код для отображения изображения), и я пытаюсь их понять, но я новичок в работе с jpegs таким образом. Мой вопрос состоит в том, что я сначала отправил любую информацию заголовка в POST из Xcode (в частности, фотоидентификатор), и если да, то как это сделать, используя exif и php. Большой вопрос, который я знаю, но любые указатели ... были в этом часами. – RGriffiths

+1

Сохраните необработанные (не базовые) данные изображения в [файл temp] (http://php.net/manual/en/function.tmpfile.php) и передайте этот путь к функции 'exif_read_data()'. Строка base64 - это закодированная строка содержимого, но эта функция должна читать файл. –

ответ

1

Не проверено, но что-то подобное должно работать.

$select = "SELECT * FROM tblPhotos"; 
$result = mysqli_query($link, $select); 

while($row = mysqli_fetch_array($result)) 
{ 
    $img = base64_encode($row['photoData']); 
    echo "<img src=\"data:image/jpg;charset=utf8;base64, $img\"/>"; 
    echo "<br>"; 

    $temp = tmpfile(); // This gives you a resource handle 
    $meta_data = stream_get_meta_data($temp); // Get the handle's metadata 
    $temp_path = $meta_data['uri']; // This gives you a path to the resource handle 

    if (!is_file($temp_path)) { 
     echo "<p>Error! Temp path not found: '$temp_path' Skipping...<br></p>"; 
     continue; 
    } 

    fwrite($temp_path, $row['photoData']); // Note I'm using the raw data, not $img 

    // Here, though, I'm passing the $temp variable, which stores a path 
    $exif = exif_read_data($temp_path, 0, true); // <<< See $temp_path? It's something like /tmp/ablkjdlfjd.tmp or whatever 

    echo $exif === false ? "No header data found.<br />\n" : "Image contains headers<br />\n"; 

    fclose($temp); // This removes the temp file. 
} 
+0

Я ценю помощь, которую вы мне даете. Это, как я сказал в обновлении .... говорит, что у меня есть заголовки, но ничего не отображает с циклом. Я правильно говорю о ключах в цикле? – RGriffiths

+0

Чувак, вы не делаете это правильно в своем коде (любая попытка). Пожалуйста, прочитайте более внимательно через код непосредственно выше. –

+0

Это процесс: 1. Получите данные из таблицы. 2. Сохраните данные в временном файле. 3. Пропустите имя файла temp в 'exif_read_data()'. 4. Используйте указанные данные. Кроме того, используйте 'var_dump ($ exif)', чтобы узнать, что вы вернете, это поможет с вашими ключами/ссылками. –

Смежные вопросы