BLOB в файл

Xromou

Новичок
BLOB в файл

В базе есть поле типа BLOB, его нужно прочесть и сохранить в файл. Объясните по пунктам как это сделать, пожалуйста. Как я понял начало должно быть примерно таким, а вот что дальше то. Хотя даже с началом я тоже не уверен
PHP:
$sql="select PIC from scard where id=1";
$stmt = oci_parse($conn, $sql);
$BLOB=oci_new_descriptor($conn, OCI_D_LOB);
oci_define_by_name($stmt, "PIC", $BLOB);
$x=oci_execute($stmt, OCI_DEFAULT);
 

tony2001

TeaM PHPClub
примерно так:

PHP:
$sql="select PIC from scard where id=1";
$stmt = oci_parse($conn, $sql);
oci_execute($stmt, OCI_DEFAULT);
$row = oci_fetch_row($stmt);

<тут открываем файл>
while ($data = oci_lob_read($row[0], 1024*1024)) {
  <тут пишем данные в файл>
}
<тут закрываем файл>
 

Xromou

Новичок
Огромное спасибо все получилось, естественно проблемы с правами, но решилось быстро. Вот полноценный код, вдруг кому нить понадобиться.
PHP:
$sql="select SCARDPIC from scard where id=1";
$stmt = oci_parse($conn, $sql); 
oci_execute($stmt, OCI_DEFAULT); 
$row = oci_fetch_row($stmt); 

$file_name="1.jpeg";
//открываем файл
$f=fopen($file_name, 'a');
while ($data = oci_lob_read($row[0], 1024*1024)) { 
	echo $data;
	//записываем в файл
	if (fwrite($f, $data) ==FALSE) {
		echo "Не могу произвести запись в файл";
		exit;
	}; 
};
//закрываем файл
fclose($f);
 

Baltazar

Новичок
Автор оригинала: Xromou
Огромное спасибо все получилось, естественно проблемы с правами, но решилось быстро. Вот полноценный код, вдруг кому нить понадобиться.
PHP:
$sql="select SCARDPIC from scard where id=1";
$stmt = oci_parse($conn, $sql); 
oci_execute($stmt, OCI_DEFAULT); 
$row = oci_fetch_row($stmt); 

$file_name="1.jpeg";
//открываем файл
$f=fopen($file_name, 'a');
while ($data = oci_lob_read($row[0], 1024*1024)) { 
	echo $data;
	//записываем в файл
	if (fwrite($f, $data) ==FALSE) {
		echo "Не могу произвести запись в файл";
		exit;
	}; 
};
//закрываем файл
fclose($f);
Warning: oci_lob_read() expects parameter 1 to be OCI-Lob, null given in
Поле точно не пустой. Из за чего возможна ошибка?

-~{}~ 23.04.09 10:27:

И ещё вопрос можно ли сделать так, что бы файл сохранялся не на сервере, а на машине пользователя? Говоря точнее в базе есть несколько exe файлов, пользователь должен иметь возможность сохранять себе нужный экзешник, точно так же как это возможно, если файл находится в каталоге сервера и мы кликаем на ссылку, указывающую на этот файл.
 

Фанат

oncle terrible
Команда форума
Из за чего возможна ошибка?
из-за того, что тупо скопирован и запускается чужой код с чужой базой и запросами
можно ли сделать так, что бы файл сохранялся не на сервере, а на машине пользователя
можно. средствами протокола НТТР
 

Baltazar

Новичок
Да нет ну запрос то конечно я свой подставил! :) Просто скопировал не тупо а надо было тупо))
 

Фанат

oncle terrible
Команда форума
правильно. так и надо. писать чужой код и спрашивать, где в твоем коде ошибка.

успешность соединения ты проверил.
а успешность выполнения запроса где?
 

Baltazar

Новичок
Автор оригинала: *****
правильно. так и надо. писать чужой код и спрашивать, где в твоем коде ошибка.

успешность соединения ты проверил.
а успешность выполнения запроса где?
Все нормально !!! файлик удачно сохранился. В моем скрипте была ошибка. Вот исправил. А не могли бы Вы подсказать, как все-таки сделать, так что бы его могли сохранять пользователи на своем компьютере?
PHP:
<?php
if (isset($_POST['login']) && isset($_POST['password'])){
   $login =  ($_POST['login']);
   $password = ($_POST['password']);
	if ($c=oci_connect($login, $password, "fin")) {
	  $query = "select START_EXE
                  from data.exe_files
                  where le_kod in (select le_kod 
                                     from grpo.user_files fi, user_name us
                                    where fi.user_id = us.user_id
                                      and us.username = user )";
	  $s = oci_parse($c, $query);
	  oci_execute($s, OCI_DEFAULT);
	  $row =oci_fetch_row($s);
	  $file_name="test.exe";
	  $f=fopen($file_name, 'a'); 
	  
		while ($data = oci_lob_read($row[0], 1024*1024)) { 
			//echo $data;
			//записываем в файл
			if (fwrite($f, $data) ==FALSE) {
				echo "Не могу произвести запись в файл";
				exit;
			}; 
		};
		//закрываем файл
		fclose($f);	
	}
	else {
	  $err = oci_error();
	  echo "Oracle Connect Error " . $err[code];
	};
};
?>
 

prolis

Новичок
Автор оригинала: Baltazar
как все-таки сделать, так что бы его могли сохранять пользователи на своем компьютере?
дать пользователю ссылку на этот файл (a href=$file_name)
 

Baltazar

Новичок
Автор оригинала: prolis
дать пользователю ссылку на этот файл (a href=$file_name)
А напрямую пользователь может из базы тянуть файл, так что бы файл не сохранялся перед этим на сервере?
 

prolis

Новичок
может, если не в файл, а сразу браузеру отдавать, выставив правильные хидеры. Но не надо (БД это не инструмент раздачи контента).
 

Xromou

Новичок
Автор оригинала: prolis
может, если не в файл, а сразу браузеру отдавать, выставив правильные хидеры. Но не надо (БД это не инструмент раздачи контента).
Угу я думаю не стоит так экспериментировать, опять же могут появится бреши в безопасности при динамическом генерировании запроса
 

Baltazar

Новичок
Автор оригинала: Xromou
Угу я думаю не стоит так экспериментировать, опять же могут появится бреши в безопасности при динамическом генерировании запроса
Например?

-~{}~ 27.04.09 12:54:

У меня вот так получилось из блоба сохранить в файл на клиенте. Как сделать лучше?
PHP:
   if ($c=oci_connect($login, $password, "fin")) {
	  $query = "select START_EXE, NAME_FILE_START
                  from data.exe_files
                 where le_kod in (select le_kod 
                                    from grpo.user_files fi, user_name us
                                   where fi.user_id = us.user_id
                                     and us.username = user )"; 	  
	  $s = oci_parse($c, $query);
	  oci_execute($s, OCI_DEFAULT);
	  $row = oci_fetch_assoc($s);
	  $file_name = $row["NAME_FILE_START"];
	  $data = $row["START_EXE"]->load();
  	  header("HTTP/1.1 200 OK"); 
  	  header("Content-Disposition: attachment; filename= \"".$file_name."\";"); 
  	  header("Content-Type: application/octet-stream; "); 
 	  echo $data;
	} else {
	  $err = oci_error();
	  echo "Oracle Connect Error " . $err[code];
	};
-~{}~ 27.04.09 12:55:

И какие все-таки бреши появляются в безопасности ?
 
Сверху