Sommige files corrupt bij downloaden uit database

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Timo Schmets

Timo Schmets

10/01/2015 20:11:09
Quote Anchor link
Goeieavond,

Ik ben bezig mijn HTML website te optimaliseren en met PHP enkele functies toe te voegen. Zo wil ik nu files die ik normaal manueel erop deed zetten via een upload script in de database laten opslaan en deze automatische laten plaatsen op een download pagina. Alle info hiervoor heb ik netjes op het internet gevonden en alles werkt tot het laatste stapje. Als ik heb gedownload komt het vaker voor dat mijn gedownload bestand corrupt is. Ik heb hier via Google op gezocht maar kan niet echt de oplossing vinden en ik zit hier nu al een paar dagen mee te klooien. Hebben jullie nog tips waar het fout in gaat?

Onderstaand mijn code die ik gebruik om de files te tonen (list_files.php) en te downloaden(get_file.php).

list_files.php
Quote:
<meta charset="utf-8">
<head>
<title>Naamloos document</title>
</head>

<body>


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?php
 // Connect to the database
 $dbLink = new mysqli('parochie-molenberg.nl', 'www', 'Welkom1', 'Parochie');
 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();
 ?>


</body>
</html>


Get_file.php
Quote:
<meta charset="utf-8">
<head>
<title>Naamloos document</title>
</head>

<body>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?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', 'www', 'Welkom1', 'Parochie');
         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.';
 }

 ?>


</body>
 
PHP hulp

PHP hulp

16/11/2024 16:47:58
 
Koen Hollander

Koen Hollander

10/01/2015 20:15:31
Quote Anchor link
Gebruik geen OOP en procedural door elkaar.
Pleur je PHP niet midden in je HTML.

Houd alles overzichtelijk zodat je je eigen fouten sneller kan zien.
Misschien kan je wel andere projecten op dit forum kijken om wat wijzer te worden.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

10/01/2015 23:57:31
Quote Anchor link
De HTML moet er uit in get_file.php. Een webserver kan veel meer dan alleen HTML teruggeven. Het kan eigenlijk bestanden in allerlei formaten teruggeven. Echter moet je de formaten niet door elkaar gooien. Op regel 32 laat je de ontvangende browser aan de hand van het MIME type weten wat de inhoud van de response (antwoord van de server) is. Stel dat dit nu een .png file is dan ga je daar dus geen HTML aan vooraf of achteraan doen.

Bovendien moeten de header() functies aangeroepen worden VOORDAT er output plaats vindt. En dan komen we aan op de opmerking van Koen die bij mij wat onvriendelijk overkomt dus zeg ik het iets genuanceerder: Begin met je PHP logica en daaronder je OUTPUT.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

// php logica
$time = time();


// hieronder de output
?>

<!doctype>
<html>
    <body>
        <h2>Huidige timestamp</h2>
        <p>huidige timestamp is: <?php echo $time; ?></p>
    </body>
</html>
Gewijzigd op 11/01/2015 00:04:59 door Frank Nietbelangrijk
 
Timo Schmets

Timo Schmets

11/01/2015 14:04:55
Quote Anchor link
Poeh, dat was een bevallig totdat ik dit snapte. Ik heb nu het PHP script neergezet en daarna pas de <head> en <body> tags. Nu werken alle downloads. Ik zeg natuurlijk dat het HTML is en download dat pas de file, dat ie dan mis gaat is natuurlijk best logisch. Bedankt voor het helpen!
 
Frank Nietbelangrijk

Frank Nietbelangrijk

11/01/2015 14:12:48
Quote Anchor link
zet dan ook een exit; tussen regel 37 en 38 zodat je script gestopt wordt wanneer de file is teruggegeven.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.