Files corrup bij downloaden uit database

Status
Niet open voor verdere reacties.

timo17

Gebruiker
Lid geworden
11 jun 2009
Berichten
375
Goeiedag,

Ik ben aan het proberen iets te bouwen zodat mensen bestanden op mijn website kunnen uploaden en downloaden. Hiervoor heb ik een mooi scriptje gevonden en dit werkt allemaal, tot het downloaden. Daar hikt hij meestal en is het bestandje corrupt als het is gedownload.

Ik heb mijn bestanden toegevoegd in een zip bestand. Het zou fijn zijn als iemand mijn code kan nakijken en me misschien kan helpen waar het hier fout gaat. Ik heb voor de veiligheid de inloggegevens uit de bestandjes gehaald.

Het resultaat is hier zichtbaar.

http://demo.parochie-molenberg.nl/send_file.php

Uploadscript:
PHP:
<?php
// Check if a file has been uploaded
if(isset($_FILES['uploaded_file'])) {

// Make sure the file was sent without errors
if($_FILES['uploaded_file']['error'] == 0) {
// Connect to the database
$dbLink = new mysqli('parochie-molenberg.nl', 'user', 'pass', 'DB');
if(mysqli_connect_errno()) {
die("MySQL connection failed: ". mysqli_connect_error());
}

// Gather all required data
$name = $dbLink->real_escape_string($_FILES['uploaded_file']['name']);
$mime = $dbLink->real_escape_string($_FILES['uploaded_file']['type']);
$data = $dbLink->real_escape_string(file_get_contents($_FILES  ['uploaded_file']['tmp_name']));
$size = intval($_FILES['uploaded_file']['size']);
 
// Create the SQL query
$query = "INSERT INTO `file` (`name`, `mime`, `size`, `data`, `created`)
            VALUES ('{$name}', '{$mime}', {$size}, '{$data}', NOW())"; 
// Execute the query
$result = $dbLink->query($query);

// Check if it was successfull
if($result) {
echo 'Success! Your file was successfully added!';
}
else {
echo 'Error! Failed to insert the file'
. "<pre>{$dbLink->error}</pre>";
}
}
else {
echo 'An error accured while the file was being uploaded. '
. 'Error code: '. intval($_FILES['uploaded_file']['error']);
}

// Close the mysql connection
$dbLink->close();
}
else {
echo 'Error! A file was not sent!';
}
// Echo a link back to the main page
echo '<p>Click <a href="send_file.php">here</a> to go back</p>';
?>

Downloadscript:
PHP:
<?php
 // Make sure an ID was passed
 if(isset($_GET['id'])) {
 // Get the ID
     $id = intval($_GET['id']);
 
     // Make sure the ID is in fact a valid ID
     if($id <= 0) {
         die('The ID is invalid!');
     }
     else {
         // Connect to the database
         $dbLink = new mysqli('parochie-molenberg.nl', 'user', 'pass', 'DB');
         if(mysqli_connect_errno()) {
             die("MySQL connection failed: ". mysqli_connect_error());
         }
 
         // Fetch the file information
         $query = "
             SELECT `mime`, `name`, `size`, `data`
             FROM `file`
             WHERE `id` = {$id}";
         $result = $dbLink->query($query);
 
         if($result) {
             // Make sure the result is valid
             if($result->num_rows == 1) {
             // Get the row
                 $row = mysqli_fetch_assoc($result);
 
                 // Print headers
                 header("Content-Type: ". $row['mime']);
                 header("Content-Length: ". $row['size']);
                 header("Content-Disposition: attachment; filename=". $row['name']);
 
                 // Print data
                 echo $row['data'];
             }
             else {
                 echo 'Error! No image exists with that ID.';
             }
 
             // Free the mysqli resources
             @mysqli_free_result($result);
         }
         else {
             echo "Error! Query failed: <pre>{$dbLink->error}</pre>";
         }
         @mysqli_close($dbLink);
     }
 }
 else {
     echo 'Error! No ID was passed.';
 }
 ?>

Weergavescript:
PHP:
<?php
 // Connect to the database
 $dbLink = new mysqli('parochie-molenberg.nl', 'user', 'pass', 'DB');
 if(mysqli_connect_errno()) {
     die("MySQL connection failed: ". mysqli_connect_error());
 }
 
 // Query for a list of all existing files
 $sql = 'SELECT `id`, `name`, `mime`, `size`, `created` FROM `file`';
 $result = $dbLink->query($sql);
 
 // Check if it was successfull
 if($result) {
     // Make sure there are some files in there
     if($result->num_rows == 0) {
         echo '<p>There are no files in the database</p>';
     }
     else {
         // Print the top of a table
         echo '<table width="100%">
                 <tr>
                     <td><b>Name</b></td>
                     <td><b>Mime</b></td>
                     <td><b>Size (bytes)</b></td>
                     <td><b>Created</b></td>
                     <td><b>&nbsp;</b></td>
                 </tr>';
 
         // Print each file
         while($row = $result->fetch_assoc()) {
             echo "
                 <tr>
                     <td>{$row['name']}</td>
                     <td>{$row['mime']}</td>
                     <td>{$row['size']}</td>
                     <td>{$row['created']}</td>
                     <td><a href='get_file.php?id={$row['id']}'>Download</a></td>
                 </tr>";
         }
 
         // Close table
         echo '</table>';
     }
 
     // Free the result
     $result->free();
 }
 else
 {
     echo 'Error! SQL query failed:';
     echo "<pre>{$dbLink->error}</pre>";
 }
 
 // Close the mysql connection
 $dbLink->close();
 ?>

Alvast bedankt!
 

Bijlagen

  • upload.zip
    3,3 KB · Weergaven: 19
Laatst bewerkt:
Hallo Timo,

Als ik een willekeurig bestand download van deze pagina "http://demo.parochie-molenberg.nl/list_files.php".
En deze dan open in notepad valt mij op dat er HTML in staat, dit kan niet de bedoeling zijn.

Om precies te zijn dit stukje:
PHP:
<!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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Naamloos document</title>
</head>

<body>

A ik heb het gevonden het staat in dit bestand "get_file.php" haal dat er maar eens uit (hier moet alleen php in staan)
 
Laatst bewerkt:
Hi Stefan,

Dat stukje zet Dreamweaver er voor mij standaard in, al heb ik nu gevonden hoe ik dat er niet meer in krijg. Ik heb het eruit gehaald en de PDF documenten werken nu, de afbeeldingen en word documenten nog niet. Dat is overigens geen probleem, ik wil namelijk alleen PDF documenten toestaan.

Bedankt!
 
Hallo Timo,

Goed om te horen dat de PDF documenten nu wel werken.
In de andere bestanden inclusief de PDF zie ik nog steeds HTML staan hier door werken de andere bestanden niet
 
Oke, ik dacht dat ik alles eruit had.

Wat moet ik dan nu nog precies veranderen?
 
Helaas werkt het nu toch niet meer. Vreemd genoeg is het zo dat als ik het bestand via de mysql client direct uit de database haal en opsla en niets mis is met het bestand en alles soorten bestanden werken. Er zit dus iets fout in de PHP code die het bestand ophaalt.
 
Zou je de bestanden dan nog een keer kunnen uploaden? kan ik er even naar kijken
 
Hoi Stefan,

Ik heb het inmiddels allemaal werken. Ik heb het stukje PHP code nu bovenaan in het script gezet en daaronder de HTML tags. Nu werken alle downloads. Bedankt voor je hulp!
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan