webForumDet fria alternativet

hjälp med blobar och utskrivning av filnamn

PHP

4 svar · 272 visningar · startad av mikael_a

Medlem sedan mars 2000475 inlägg
Frågan#1

Jag sparar olika filer i en databas som en blob, dessa vissas genom showFiles.php och trycker man på länken ladda ner, så anropas filen downloadFile.asp och filen laddas ner... nackdelen är att filnamnet blir downloadFile.xxx (xxx = fil ändelse) hur gör man för att filen skall få namnet tex bild.jpg och inte downloadFile.jpg....

databasen ser ut enligt följande:

id (int) = id
title (tinytext) = rubrik (tex bild på datorn)
description (text) = beskriving
file (longblob) = själva bilden som en blob
file_name (text) = fil namnet (tex bild.jpg)
file_size (int) = storleken på bilden
file_typ (tinytext) = typ av fil, tex .zip, .jpg, .doc osv)
added (datetime) = datum
visible (tinyint) = 1 eller 0

det som skall visas är alltså file_name


*** showFiles.asp ***

<?php

// Database connection variables

$dbServer = "localhost";
	$dbDatabase = "xxx";
		$dbUser = "xxx";
			$dbPass = "xxx";

$sConn = mysql_connect($dbServer, $dbUser, $dbPass)
	or die("Couldn't connect to database server");

$dConn = mysql_select_db($dbDatabase, $sConn)
	or die("Couldn't connect to database $dbDatabase");

$dbQuery = "SELECT id, title, file_type ";

$dbQuery .= "FROM ca_entry ";

$dbQuery .= "ORDER BY added DESC";

$result = mysql_query($dbQuery) or die("Couldn't get file list");

?>

<table border="1" cellpadding="0" cellspacing="0" bordercolor="#111111" width="100%">
<tr><td width="34%" bgcolor="#FF9900" height="21">

<p style="margin-left: 10"><b><font size="2" face="Verdana" color="#FFFFFF">

Beskrivning</font></b></td>

<td width="33%" bgcolor="#FF9900" height="21">

<p style="margin-left: 10"><b><font face="Verdana" size="2" color="#FFFFFF">

Filtyp</font></b></td>

<td width="33%" bgcolor="#FF9900" height="21">

<p style="margin-left: 10"><b><font face="Verdana" size="2" color="#FFFFFF">

Fil</font></b></td></tr>

<?php

while($row = mysql_fetch_array($result))

{

?>

<tr>

<td width="34%" bgcolor="#FFDCA8" height="21">

<p style="margin-left: 10; margin-right: 10">

<font face="Verdana" size="1">

<?php echo $row["title"]; ?>

</font>

</td>

<td width="33%" bgcolor="#FFDCA8" height="21">

<p style="margin-left: 10">

<font face="Verdana" size="1">

<?php echo $row["file_type"]; ?>

</font>

</td>

<td width="33%" bgcolor="#FFDCA8" height="21">

<p style="margin-left: 10"><font face="Verdana" size="1">

<a href="downloadFile.php?id=<?php echo $row["id"]; ?>">

Ladda ner

</a></font>

</td>

</tr>

<?php

}

echo "</table>";

?>

*** downloadFile.asp ***

<?php

$id = $_GET[id];

//$id;

if(!is_numeric($id))
	die("Invalid id specified");

// Database connection variables

$dbServer = "localhost";
	$dbDatabase = "xxx";
		$dbUser = "xxx";
			$dbPass = "xxx";

$sConn = mysql_connect($dbServer, $dbUser, $dbPass)
	or die("Couldn't connect to database server");

$dConn = mysql_select_db($dbDatabase, $sConn)
	or die("Couldn't connect to database $dbDatabase");

$dbQuery = "SELECT file_name, file_type, file ";

$dbQuery .= "FROM ca_entry ";

$dbQuery .= "WHERE id = $id";

$result = mysql_query($dbQuery) or die("Couldn't get file list");

if(mysql_num_rows($result) == 1)

{

$fileType = @mysql_result($result, 0, "file_type");

$fileContent = @mysql_result($result, 0, "file");

header("Content-type: $fileType");

echo $fileContent;

}

else

{

echo "Record doesn't exist.";

}

?>

tack för all hjälp...

Medlem sedan aug. 20002 975 inlägg
#2

Det där med att sätta headers för nedladdning, och som funkar i alla webläsare, verkar vara en djungel.
Läser du användarnoteringarna för header i manualen så sägs det mycket om det. Det är inte säkert att du blir klokare, men jag rekommenderar en ordentlig genomläsning här: http://se.php.net/manual/en/function.header.php

Med lite av vad som framgår där, och på andra håll har jag funnit att man kommer en bit på vägen med (det downloadskript som jag använder):

$sql = "SELECT * FROM file_table where id='{$_GET['id']}'";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);

header("Content-Type: application/save"); 
header("Content-type: ".$row['filetype']);
header("Content-Disposition: attachment; filename=".$row['filename']); 
header("Content-Length: ".$row['filesize']); 
header("Content-Transfer-Encoding: binary"); 

echo $row['bin_data'];

Jag tror ändå det är långt ifrån heltäckande, och det finns säkert saker som kunde gjorts annorlunda och bättre.

Medlem sedan mars 2000475 inlägg
#3

hmmm jag får parse error på rad 22 dvs header("Content-Length: $file_size");


if(mysql_num_rows($resultat) == 1){
		$fileType = @mysql_result($resultat, 0, "file_type");
		$fileContent = @mysql_result($resultat, 0, "file");

		header("Content-Type: application/save");
		header("Content-type: $fileType");
		header("Content-Disposition: attachment; file_name=$file_name);
		header("Content-Length: $file_size");
		header("Content-Transfer-Encoding: binary");

		echo $fileContent;

	}//end if...
	else{
		echo "Record doesn't exist.";
	}//end else...
Medlem sedan juni 20001 251 inlägg
#4

Det fattas en " på raden ovan.

Medlem sedan mars 2000475 inlägg
#5

tack... jag löste det :)

jag använde:


if($data = mysql_fetch_assoc($resultat)){
		if(stristr('mac', $_SERVER['HTTP_USER_AGENT'])) {
			$type = 'application/download';

			} else {
				$type = 'application/octet-stream';
        	}

			header("Content-Type: {$type}");
		   	header("Content-Disposition: attachment; filename=\"{$data['file_name']}\"");
		   	header("Content-Length: {$data['file_size']}");
		   	header("Content-Transfer-Encoding: binary");
		   	echo $data['file'];
            return TRUE;

		}
		        else {
		            return FALSE;
		            echo "Record doesn't exist.";
		        }
251 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
119 ms — ändringar (db)