5 Stimmen

Download nach Formularübermittlung mit Validierung servieren

Ich habe zusammen eine ziemlich einfache Download Code Einlöser in .php (dank Hilfe von hier) erstellt und bin mit einer harten Zeit versuchen, herauszufinden, was der beste Weg, um einen Download zu dienen ist, wenn die Validierung erfolgreich ist. Im Grunde -

Der Benutzer gibt einen ungültigen Code ein -> Die Seite wird mit einer Fehlermeldung neu geladen. Benutzer gibt gültigen Code ein -> Geben Sie Download "Speichern unter" -> Seite aktualisieren.

Im Moment verwende ich http://www.zubrag.com/scripts/download.php um die Datei bereitzustellen, aber sobald das Herunterladen begonnen hat, aktualisiert mein Formular die Seite, lädt aber nur die Hälfte des Inhalts?!

Dies ist das Formular mit dem PHP-Skript, das ich erstellt habe.

<div class="dcrForm">
    <p>Have a physical copy of this release? Claim your digital download by entering your Download Code below.</p>
    <form  action="index.php" method="post">
        <input type="text" name="code" class="dcrInput" value="">
        <input type="submit" name="harrisSubmit" class="dcrSubmit" value="Submit">
    </form>
<?php
    include("scripts/dcr_config.php");
    $code="";
    $log="";

    if (isset($_POST['harrisSubmit']))
    {
        $code=$_POST['code'];

        $link = mysql_connect($hostname, $dbusername, $dbpassword);
        mysql_select_db("$databasename");

        $query = "select count from $harris where code='$code'";
        if ($q=mysql_query($query))
            if ($r=mysql_fetch_array($q)){
                if ($r[0]<3)
                {
                    $subquery="update $tbname set count='".($r[0]+1)."' where code='$code'";
                    mysql_query($subquery);
                    ?><script>window.location.href="download.php?f=test.txt";</script><?php
                }
            }
        $log="<p>Invalid code. Try Again.</p>";
    }
    echo $log."";
?>
</div>

Hat jemand eine Idee, wie man den Download am besten servieren könnte? Ich weiß, dass derzeit jeder, der den Speicherort der Datei hat, die Datei herunterladen kann, aber ich bin mir nicht sicher, wie ich die Datei schützen kann.

4voto

drew010 Punkte 66884

Ich freue mich, dass Sie es bis hierher geschafft haben!

Wenn Sie den Benutzer zu einem Download-Skript umleiten, muss dieses Skript mit einer Art Token versehen sein, um unautorisierte Downloads zu verhindern, d. h. der Code oder das Token muss erneut überprüft werden.

Im obigen Skript könnten Sie statt der Ausgabe von Javascript zur Weiterleitung an das Download-Skript dies tun:

<?php

include "scripts/dcr_config.php";
$code = "";
$log  = "";

if (isset($_POST['harrisSubmit'])) {
    $code = trim($_POST['code']);

    $link = mysql_connect ( $hostname, $dbusername, $dbpassword );
    mysql_select_db ( "$databasename" );

    $code = mysql_real_escape_string($code); // very important! protects against exploits

    $query = "select count from $harris where code='$code'";
    if ($q = mysql_query ( $query )) {
        if ($r = mysql_fetch_array ( $q )) {
            if ($r [0] < 3) {
                $subquery = "update $tbname set count='" . ($r [0] + 1) . "' where code='$code'";
                mysql_query ( $subquery );

                $file = '/path/to/protecteddownload.txt';

                // send file to browser as a download dialog
                // no content can be output prior to these header() calls
                header('Content-type: application/octet-stream');
                header('Content-Disposition: attachment; filename="file.txt"');
                header('Content-Length: ' . filesize($file));
                header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
                header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");

                echo file_get_contents($file);
                exit; // terminate script
            } else {
                $log = 'Sorry, this code has already been redeemed.';
            }
        } else {
            $log = 'Invalid download code.  Try again.';
        }
    } else {
        // query failed
        $log = 'An error occurred validating your code, please try again later.';
    }

    $log = "<p>Invalid code. Try Again.</p>";
}

?>

<?php if (isset($log) && $log != ''): ?>
<strong class="error"><?php echo $log ?></strong>
<?php endif; ?>

<div class="dcrForm">
<p>Have a physical copy of this release? Claim your digital download by
entering your Download Code below.</p>
<form action="index.php" method="post"><input type="text" name="code"
    class="dcrInput" value=""> <input type="submit" name="harrisSubmit"
    class="dcrSubmit" value="Submit"></form>
</div>

Das Download-Skript ist wahrscheinlich ähnlich wie das, was ich oben habe. Der Clou an diesem Beispiel ist, dass die Datei, die Sie mit file_get_contents bereitstellen, nicht über das Web zugänglich ist. Sie wird nur gesendet, wenn ein gültiger Code eingegeben wird.

1voto

Richard Niemand Punkte 141

Ich habe nur eine kurze Frage: Wie groß ist diese Datei? Könnte dies ein Fall sein, dass die php-Zeitüberschreitung beim Lesen der Datei in den Browser erlebt wird?

Sie können mit den php-Einstellungen herumspielen, um dies zu bestätigen (http://php.net/manual/en/function.set-time-limit.php).

Nur meine 2 Cents

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X