webForumDet fria alternativet

Problem Lagra word-dokument i databas

2 svar · 301 visningar · startad av hltm

hltmMedlem sedan nov. 2004438 inlägg
#1

Hej, jag vill ladda upp word-/exceldokument f lagring i databas(nej, jag vill inte lagra dem som filer i ngn katalog ;) ). Jag har skapat tabell & fält f detta(longblob).
Hittade nedanstående som jag pillat lite med, bl a bytt ($form_data, "r") till ($form_data, "rb") eftersom jag kör på win xp

<?php

// store.php3 - by Florian Dittmer <dittmer@gmx.net>
// Example php script to demonstrate the storing of 
// binary files into an sql database. 
// More information can be found at
// [url]http://www.phpbuilder.com/[/url]
?>

<html>
<head><title>Store binary data into SQL Database</title></head>
<body>

<?php
if (isset($_POST['submit'])) {

include ("conn.php");
$connection = mysql_connect($host, $user, $password) or die("Kunde inte skapa koppling!");
mysql_select_db($db,$connection) or die("Kunde inte välja databas");

    $data = addslashes(fread(fopen($form_data, "rb"), filesize($form_data)));

    $result=MYSQL_QUERY("INSERT INTO tbl_files (description, bin_data, filename, filesize, filetype) ".
        "VALUES ('$strDescription','$data','$form_data_name','$form_data_size','$form_data_type')");

    $id= mysql_insert_id();
	echo mysql_errno($connection) . ": " . mysql_error($connection) . "\n";
    print "<p>This file has the following Database ID: <b>$id</b>";

    MYSQL_CLOSE();

} else {

?>

    <form method="post" action="<?php echo $PHP_SELF; ?>" enctype="multipart/form-data">
    File Description:<br>
    <input type="text" name="strDescription"  size="40">
    <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
    <br>File to upload/store in database:<br>
    <input type="file" name="form_data"  size="40">
    <p><input type="submit" name="submit" value="submit">
    </form>

<?php

}

?>

</body>
</html>

Felmeddelandet:
Warning: fread(): supplied argument is not a valid stream resource in C:\Apache2\htdocs\add_files\add2.php on line 24
Alltså den här raden:

    $data = addslashes(fread(fopen($form_data, "rb"), filesize($form_data)));

Har läst mig till att fread "inte funkar" med min php-vers, sett förslag om att istället använda:

if (!is_readable ($binFile)) {
	print ("Il file $binFile non e' leggibile!");
} else {
	$handle = fopen ($binFile, 'rb'); 
	$contents = ""; 
	do { 
	   $data = fread($handle, 8192); 
	   if (strlen($data) == 0) { 
		   break; 
	   } 
	   $contents .= $data; 
	} while(true); 
	fclose ($handle); 
	$data = addslashes ($contents); 
}

Men hur, att bara byta ut dem rakt av fungerar ju inte, "något mer måste ju till"?

Miljö: Apache/2.0.43 (Win32) PHP/4.3.9

MatteMedlem sedan aug. 20002 975 inlägg
#2

fread() är nog inte problemet i sammanhanhanget.

Av ditt felmeddelande ser det snarare ut som om den temporära filen inte kunde öppnas.

Är register_globals satt på på din server ?
Om inte måste du istället använda $_FILES['form_data']['tmp_name'], vilket du bör vänja dig vid att göra i vilket fall.

Dela upp din kod lite för att få ett felmeddelande även när du försöker öppna filen.

Ändra

    $data = addslashes(fread(fopen($form_data, "rb"), filesize($form_data)));

// Till
    $fp = fopen($_FILES['form_data']['tmp_name'], 'rb');
    $data = fread($fp, filesize($_FILES['form_data']['tmp_name']));
    fclose($fp);

Vad får du för felmeddelande nu ?

hltmMedlem sedan nov. 2004438 inlägg
#3

Jättebra, skall testa detta omgående, återkommer med resultat. :)
(Bakgrunden t att spara dok i db är att jag vill kunna spara o öronmärka dokument för x antal företag på ett o samma ställe och slippa en djungel av kataloger/underkataloger utanför root. Funderade på att vid uppladdning döpa om varje dok m företagspec prefix spara i en katalog och strippa detta vid läsning/nedladdning men det kändes "meckigt".
:)

127 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)