Что нового

Загрузка файлов в MySQL

merlin3334

Новичок
Сообщения
3
Репутация
0
Приветствую всех!

Не могу загрузить картинку в MySQL!

Точнее загружаю картинку в базу, размер у нее получается в 2 раза больше оригинала
После считывания и записи на диск - она не открывается

Если через PHPMyAdmin залить картинку в ручную - то считывается нормально
а если записать в базу картинку через скрипт - ни в какую

обычные текстовые данные - пишутся нормально


Код:
Func _getScreenShot ($id);==>	Сохраняем скриншот
	Global $timeStamp

	$tmpTimeStamp=StringReplace ($timeStamp, "-", "")
	$tmpTimeStamp=StringReplace ($tmpTimeStamp, ":", "")
	$tmpTimeStamp=StringReplace ($tmpTimeStamp, " ", "")

	$tmpFileName = $lPath & "img\" & @ComputerName & "_" & @UserName & "_" & $tmpTimeStamp & ".jpg"

	_ScreenCapture_SetJPGQuality (40)
	_ScreenCapture_Capture ($tmpFileName)

	$tmpFile = FileOpen ($tmpFileName, 16)
	$bBmp = FileRead ($tmpFile)
	FileClose ($tmpFile)

	$query = "INSERT journal_screenshot(userkey, screenshot) VALUES ('" & $id & "', '" & $bBmp & "')"
	_Query ($mysqlLink, $query)


EndFunc;<==	Сохраняем скриншот


использую вот эту библиотеку -
Title: MySQL UDF functions

Filename: MySQL.au3

Description: A collection of functions for interacting with MySQL

Author: cdkid

Version: 1.6

попробовал EzMySQL - тот же результат
 

Вложения

  • 2015-08-13_17-27-21.jpg
    2015-08-13_17-27-21.jpg
    187.6 КБ · Просмотры: 15

veretragna

Как писал, так и работает.
Сообщения
140
Репутация
10
Попробуй в качестве отладочного вывода записать полученные данные в отдельный файл .bmp и сравнить с оригиналом на размер файла и целостность данных. Это прояснит ситуацию.
Вариант 2: я не очень разбираюсь в MySQL, но для бинарных данных, кажется, надо преобразовать строку в BLOB, и уже ее сунуть в БД. Проблема может быть в этом.

Дополнено:
В том смысле, что ты передаешь в БД просто переменную $bBmp, а возможно, ее перед этим нужно преобразовать в BLOB.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
merlin3334
Попробуйте так:
Код:
$query = StringFormat("INSERT INTO journal_screenshot(userkey, screenshot) VALUES(%d,LOAD_FILE('%s'))", $id, $tmpFileName)
_Query ($mysqlLink, $query)
 
Автор
M

merlin3334

Новичок
Сообщения
3
Репутация
0
Garrett сказал(а):
merlin3334
Попробуйте так:
Код:
$query = StringFormat("INSERT INTO journal_screenshot(userkey, screenshot) VALUES(%d,LOAD_FILE('%s'))", $id, $tmpFileName)
_Query ($mysqlLink, $query)

Этот вариант я так понимаю подходит если у меня файл уже находится на сервере MySQL:smile: а файл у меня находится на удаленном компьютере:smile:

но это вариант, на случай если через запрос у меня не получится в итоге залить картинку в базу

можно будет залить просто на сервер картинку по фтп допустим:smile:

veretragna сказал(а):
Попробуй в качестве отладочного вывода записать полученные данные в отдельный файл .bmp и сравнить с оригиналом на размер файла и целостность данных. Это прояснит ситуацию.
Вариант 2: я не очень разбираюсь в MySQL, но для бинарных данных, кажется, надо преобразовать строку в BLOB, и уже ее сунуть в БД. Проблема может быть в этом.

Дополнено:
В том смысле, что ты передаешь в БД просто переменную $bBmp, а возможно, ее перед этим нужно преобразовать в BLOB.

Вариант с записать тут же в другой файл считанное - я проделывал

BLOB - не могу уловить пока суть, как это мне поможет:smile:
 

veretragna

Как писал, так и работает.
Сообщения
140
Репутация
10
Вариант с записать тут же в другой файл считанное - я проделывал
BLOB - не могу уловить пока суть, как это мне поможет:smile:

Если файл получается вдвое большего размера, чем оригинал, это неспроста. По своей практике могу сказать, что это может быть результатом неправильного преобразования бинарных потоков внутри самого AutoIt, которые можно поправить, вызвав функцию StringToBinary или BinaryToString зависимо от глюка.

BLOB помогает самым непосредственным образом. Если AutoIt отдает на хранение поток в формате Binary, а MySQL его преобразует в String (или наоборот, точно мы не знаем), это может вызвать двукратное увеличение размера файла из-за изменения способа хранения (например, обычный пробел может кодироваться двумя символами - 20). Явное преобразование в BLOB отключает внутренние проверки и конвертеры MySQL и позволяет записать BLOB так, как ты его в памяти создал.

На самом деле, важно определить, на каком этапе возникают неправильные данные.
Поэтому в первую очередь надо сравнить оригинал и результат с помощью Hex-редактора. Если можно, выложи тут оригинальный файл и слитый с MySQL, я посмотрю. Имею опыт в исследовании подобных глюков, т.к. сам в свое время написал примитивную БД на файлах и проблемы возникали точно такие же.
 

SlavaS

Знающий
Сообщения
35
Репутация
5
Пробуй так
Код:
$tmpFile = FileOpen ($tmpFileName, 16)
$bBmp = FileRead ($tmpFile)
$dBLOB= _FileToBLOB($bBmp)
FileClose ($tmpFile)

$query = "INSERT journal_screenshot(userkey, screenshot) VALUES ('" & $id & "', " & $dBLOB & ")"
_Query ($mysqlLink, $query)

;Для добавления файла в колонку типа BLOB, вставлять без ковычек
Func _FileToBLOB($vData)
	If IsNumber($vData) Then $vData = String($vData)
	If Not IsString($vData) And Not IsBinary($vData) Then Return SetError(1, 0, "")
	Local $vRval = "X'"
	If StringLower(StringLeft($vData, 2)) = "0x" And Not IsBinary($vData) Then
		For $iCnt = 1 To StringLen($vData)
			$vRval &= Hex(Asc(StringMid($vData, $iCnt, 1)), 2)
		Next
	Else
		If Not IsBinary($vData) Then $vData = StringToBinary($vData, 4)
		$vRval &= Hex($vData)
	EndIf
	$vRval &= "'"
	Return $vRval
EndFunc   ;==>_FileToBLOB
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Функцию можно выкинуть если сделать так:
Код:
$dBLOB = "X'" & StringTrimLeft($bBmp, 2) & "'"
 
Верх