Gå til innhold

Hjelp med opplasting til bildedatabase


Anbefalte innlegg

Hei. Jeg skal lage et program med opplasting til en bildedatabase, der data er lagret som en longblob i databasen. Såvidt jeg kan se, fungerer det meste,utenom at

$data = file_get_contents($_FILES['image']['name']) blir NULL, og jeg skjønner ikke helt hvorfor.. Ville satt pris på om noen kunne tatt en titt på programmet.

 

Her er koden:

 

DBConnect.php

<?php
$db_host = 'x';
$db_user = 'x';
$db_pwd = 'x';
$database = 'imagetest';
$mysqli = new mysqli($db_host, $db_user, $db_pwd, $database);
if ($mysqli->connect_error){
die("Connection failed". $mysqli->connect_error);
}
?>

 

upload.php

<html>
<head>
</head>
<body>
<h1>Last opp bilde</h1>
<form action="process.php" method="POST" enctype="multipart/form-data">
<label>Title: </label>
<input type="text" name="title" id="title"><br>
<label>Photo</label>
<input type="file" name="image" id="image"/><br><br>
<input type="submit" value="upload">
</form>
</body>
</html>

 

process.php

<?php
require_once("DBConnect.php");
require_once("DBQuery.php");
$db = new DBQuery();

if($_SERVER['REQUEST_METHOD'] == 'POST')
{

$title = $_POST['title'];

if($title == '')
{
 $msg = 'Error: No title name';
}
else
{
 if(isset($_FILES['image']))
 {
  $ext = pathinfo($_FILES['image']['name'], PATHINFO_EXTENSION);

  $acceptedFiles = array("pdf", "jpeg", "jpg", "png", "gif");
  $acceptMimeType = false;

  foreach($acceptedFiles as $i)
  {
   if($ext == $i)
   {
 $acceptMimeType = true;

   }
  }
  if(!$acceptMimeType){
   $msg = 'Error: Unknown file format';
  }

  if(!isset($msg))
  {
   $data = file_get_contents($_FILES['image']['name']);
   $db->insertPicture($title, $data);

   $msg = 'Success: Image uploaded.';

  }

 }
}
}
echo $msg;
echo '<br><br>';

?>
<a href="index.php">Tilbake</a>

 

DBQuery.php

<?php
require_once ("DBConnect.php");
class DBQuery{

function __construct()
{

}

public function insertPicture($title, $data)
{
 $query = "INSERT INTO images(title, data) VALUES (?,?)";
 if($stmt = $mysqli->prepare($query))
 {  
  $stmt -> bind_param(1, $title);
  $stmt -> bind_param(2, $data);
  //$stmt -> send_long_data(0, $data);

  $stmt -> execute();
 }
}
function deletePicture($id){

}
function viewPicture($id){

}
function viewAllPictures(){

}
}

 

 

Ellers er jeg åpen for tips ellers, med tanke på at det kun er et par uker siden jeg begynte med php.

Endret av vebbiii
Lenke til kommentar
Videoannonse
Annonse

Du vil ikke ha bildedata i databasen. Det kan være at du tror du vil ha det, men egentlig så vil du ikke det. :)

 

Når det er sagt så er $_FILES['x']['name'] det originale filnavnet, men fildataene finner du med file_get_contents($_FILES['x']['tmp_name']);

 

Dette er fordi at filen blir lagret med et midlertidig navn på serveren for å unngå at to filer med samme navn lastet opp "samtidig" overskriver hverandre.

 

...og du vil virkelig ikke ha fildata i en database.

 

Se forøvrig resten av matrisen her: http://www.php.net/manual/en/features.file-upload.post-method.php

Lenke til kommentar

Takk, det funket :)

 

Angående lagring av bilder som binær data direkte i databasen, så burde jo dette i utgangspunktet være det samme som å lagre URL-en til bildet i filsystemet. Jeg er klar over at det er visse andre forskjeller også, f.eks:

- Det kan være noe mer ressurskrevende, og øke forsinkelsen til andre query's(ikke noe stort problem for min del)

- Bildet vil i utgangspunktet ikke cache-s i browseren(men dette kan løses ved koding)

- Enkelte webhoster tillater ikke bruk av binær data i DB(Ikke relevant for min del)

 

Hovedgrunnen til at jeg gjør det på denne måten her er coherency og lettere backup. Ift backup vil alt ligge lagret i en enkelt fil osv, mens ved coherency vil jeg unngå at enkelte brukere sletter bilder direkte i filsystemet, mens linken fortsatt ligger i databasen, altså at datastrukturen blir korrupt.

 

Dog, så er dette fortsatt den første bildedatabasen jeg lager, så det er selvsagt godt mulig jeg oppdager at det ikke er en god løsning likevel.

 

Men jeg er veldig interessert i å høre andre argumenter for eller mot en bildedatabase :)

Lenke til kommentar

Se for deg at du lagrer 10 bilder på 10 Mb i databasen, er du klar over hvor mye informasjon det kommer til å tilsvare i tabellene dine og hvor tregt det kommer til å gjøre spørringene? Antar du kommer til å møte flaskehals ila få bilder.

 

Det er INGEN som gjør dette på denne måten, og med god grunn!

Lenke til kommentar

Du sier det er mer eller mindre det samme, men dette stemmer ikke. Å sammenligne en relativ URL med tusen linjer binær data er så langt unna tilsvarende som det er mulig å komme.

 

Det kan hende det finnes noen positive sider ved å gjøre det på denne måten, men de negative er store at det ikke utligner vekta overhode. Gjør som har blitt foreslått, eller utvikle ditt eget databasesystem, fordi dagens kommer neppe til å takle all lagringen etter en liten stund.

Lenke til kommentar

.. så burde jo dette i utgangspunktet være det samme..

Du sier det er mer eller mindre det samme, men dette stemmer ikke. Å sammenligne en relativ URL med tusen linjer binær data er så langt unna tilsvarende som det er mulig å komme.

 

Det kan hende det finnes noen positive sider ved å gjøre det på denne måten, men de negative er store at det ikke utligner vekta overhode. Gjør som har blitt foreslått, eller utvikle ditt eget databasesystem, fordi dagens kommer neppe til å takle all lagringen etter en liten stund.

 

Jeg sa ikke at det var det samme, men at det strengt tatt er samme dataen du henter frem, og at det derfor ikke burde være en betydelig forskjell. Uansett, det er mer eller mindre et prosjekt for å se hvordan ytelsen blir i praksis, egentlig mest for nysgjerrighetens del ;)

Lenke til kommentar

Du sier det er mer eller mindre det samme, men dette stemmer ikke. Å sammenligne en relativ URL med tusen linjer binær data er så langt unna tilsvarende som det er mulig å komme.

Dette er en sannhet med modifikasjoner. Hvis du har et filsystem som er optimalisert for store filer så vil du ikke ha en nevneverdig ytelsesdegradering for datatilgang så lenge tabellene er fornuftig formgitt.

Den største grunnen til å ikke lagre fildata i en database er at man mister fleksibilitet til å gjøre operasjoner på dataene igjennom rutiner som forventer at bildene er lagret som en fil. Dette kan typisk være batch-verktøy. En annen grunn er at databasebackup ikke er differensiell og en fil som er lagret en gang vil bli tatt backup av gjentatte ganger. Hvis den ligger i et filsystem så vil den bli tatt backup av en gang.

  • Liker 1
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...