Witam, mam za zadanie stworzyć prosty interfejs w PHP, który dodaje zdjęcia do bazy danych Oracle. Postępowałem zgodnie z instrukcją znajdującą się tutaj: http://programowanie.opole.pl/archives/1524#, ale niestety pliki nie chcą się dodawać do bazy za pomocą formularza w html. Po wyborze pliku i użyciu przycisku "Update" w miejscu gdzie znajduje się ścieżka do zdjęcia z powrotem pojawia się napis "Nie wybrano pliku" i zdjęcie nie zostaje dodane do bazy. Formularz i stroną dodającą zdjęcia uruchamiam za pomocą localhosta. Korzystam z konta w sqldeveloper, oraz z pakietu WebServ. Wielkość zdjęcia, które przykładowo dodaję to 26.9 kB. Bardzo proszę o pomoc w rozwiązaniu problemu.
W oraclu musisz utworzyć obiekt katalogu.
CREATE DIRECTORY NAZWA_OBIEKTU_FOLDER AS "C:\sciezka_do_folderu";
I w miejscach gdzie ma być scieżka do pliku wklepać NAZWA_OBIEKTU_FOLDER.
Czy ścieżka_do_folderu dotyczy folderu w którym znajduje się formularz do dodawania zdjęć? Czy mógłbym prosić o szczegółowe wyjaśnienie na jakimś przykładzie?
Folder dotyczy katalogu ze zdjęciem.
Ten obiekt musi być stworzony po stronie Oracle i tylko tam wykorzystywany.
http://docs.oracle.com/cd/B12037_01/server.101/b10759/statements_5007.htm
Czyli np. jeśli zdjęcia mają być dodawane z folderu "Zdjecia" znajdującego się bezpośrednio na dysku E to polecenie będzie wyglądało tak:
CREATE DIRECTORY Zdjecia AS "E:" ?
@Crash89 że co?? Z tego co rozumiem, chodzi o wrzucenie zdjęcia do bloba w bazie, nie o zapisywanie bezpośrednio na dysku; a nawet gdyby o to chodziło, to trzeba by to zrobić z poziomu php, nie przez bazę, więc co tu ma do rzeczy oraclowe directory?
Błąd jest po stronie samego html-a, gdybyś mógł zarzucić kodem, może da się pomóc.
A to mi sie pomieszało bo DIRECTORY jest potrzebne do BFILE a nie do BLOBA,
chociaz w tym wypadku, skoro kolega robi to na localhoscie BFILE też powinno zadziałać.
A do rzeczy ma Oraclowe Directory to, że bez stworzonego obiektu folderu BFILE nie zadziała.
Skojarzyłem to bo miałem kiedyś podobny problem i odrzucał mi podobny komunikat, z tymże ja wpisywałem wtedy bezpośrednio ściezke do folderu i problemem był właśnie brak odpowiedniego obiektu folderu, który trzeba wstawiać w miejsce ścieżki.
Podaję wszystkie kody, plików jakie używałem:
- Dodawanie tabeli do bazy danych:
CREATE TABLE zdjecia (
id NUMBER PRIMARY KEY,
zdjecie BLOB
)
- Formularz html:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1250" />
<meta name="author" content="speedos1254" />
<title>Dodawanie zdjęcia do bazy danych</title>
</head>
<body>
<body bgcolor="99FF99">
<center><font size="6"><font color="3300CC"><b><i>Przesyłanie zdjęcia do bazy danych</center></font></font></b></i>
<br />
<br />
<font size="4"><font color="3300CC"><b>Wybierz zdjęcie do dodania</font></font></b>
<br />
<br />
<form method="post" enctype="multipart/form-data" accept="image/png,image/jpeg,image/gif">
<font color="3300CC">Zdjęcie:</font> <input name="userfile" type="file" >
<input name="upload" type="submit" value="Wyślij zdjęcie do bazy danych">
</form>
</body>
</html>
- Plik PHP dodający zdjęcie do bazy danych
<?php
$con = OCILogon("user","password");
if (!$con) {
echo "ERROR: OCILogon";
exit;
}
echo "OK: OCILogon <br>";
$lob = oci_new_descriptor($con, OCI_D_LOB);
$sql = "INSERT INTO zdjecia (id, zdjecie) VALUES(1, EMPTY_BLOB()) RETURNING zdjecie INTO :BLOBDATA";
$stid = OCIParse($con, $sql);
oci_bind_by_name($stid, ":BLOBDATA", $lob, -1, OCI_B_BLOB);
$res = OCIExecute($stid, OCI_NO_AUTO_COMMIT);
if (!$res) {
echo "ERROR: OCIExecute";
exit;
}
echo "OK: OCIExecute <br>";
$save = $lob->savefile($_FILES['userfile']['tmp_name']);
if (!$save) {
echo "ERROR: savefile";
exit;
}
echo "OK: OCIExecute <br>";
oci_commit($con);
?>