datei upload in mysql db!?

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von mcnewbie, 11.08.2006.

  1. mcnewbie

    mcnewbie Thread Starter MacUser Mitglied

    Beiträge:
    1.213
    Zustimmungen:
    5
    MacUser seit:
    09.08.2004
    guten morgen,

    ich bin da grad am (versuchen *g*) coden für eine online-seminarverwaltung... da kann ein seminar angelegt werden und dazu gleich dateien hochgeladen werden. registrieren können sich nur user die den seminarcode haben und auch die dateien soll man nur bekommen, wenn man ordnungsgemäß registriert ist.
    jetz war mein gedanke die dateien in ein blob feld der datenbank zu speichern, v.a. aus sicherheitsgründen.

    jetz is halt die frage wie sinnvoll das ist, wenn da zB ein zip file mit fotos das 20-30 mb hat in der db steht, bzw ob das überhaupt möglich ist? mir fällt keine vernünftige alternative ein. was meint ihr cracks? *g*

    geht das überhaupt mit blob in db?

    thx 4 support! ;)
     
  2. wegus

    wegus MacUser Mitglied

    Beiträge:
    15.045
    Zustimmungen:
    1.318
    MacUser seit:
    13.09.2004
    Du wirst 2 Probleme lösen müssen:

    (1) Der Uplaod ist meist limitiert via PHP ( schau mal in die php.ini meist sind es 2MB). Mußt also das Limit anheben

    (2) BLOBs in DB geht, meist bis zu 64 MB. Macht man aber selten, denn das ist nicht performant. Bedenke das jede Transaktion gelogged wird und in Puffern aufgehoben wird - jedes UPDATE. Wenn die Zeilen einer Tabelle da nicht mehr im KB-Bereich sind sondern im MB-Bereich wird das nicht schneller!

    Mein Vorschlag: Ablegen der Dateien in geschützten Bereichen ( z.B.per .htaccess). Zugriff via Web-Frontend UND generieren des Dokumentenpfades via DB. Also nur den Pfad zum Dokument in die Datenbank ( als Text), nicht aber das Dokument und das Dokument vor unauthorisiertem Zugriff schützen.
     
  3. Manjo

    Manjo MacUser Mitglied

    Beiträge:
    903
    Zustimmungen:
    22
    MacUser seit:
    25.07.2005
    Ja stimmt, Dateien in der DB abzulegen, ist nicht sonderlich performant. Machen fast alle so, die Dateien in einem extra Verzeichnis abzulegen. Ich löse das meist so, dass ich das Verzeichnis per .htaccess schütze und die darin enthaltenen Dateien per PHP-Skript streame. Dann kann ich vorher im Skript die Berechtigung prüfen und anschließend die Datei schicken oder auch nicht. Zudem sieht niemand, in welchem Verzeichnis die Dateien liegen.

    Wenn Du dazu was suchst, dann schau Dir mal den Attachment-Mod von phpBB an. Dort gibt es eine Funktion send_file_to_browser. Funzt ganz gut.

    PHP:
    /***************************************************************************
     *                                download.php
     *                            -------------------
     *   begin                : Monday, Apr 1, 2002
     *   copyright            : (C) 2002 Meik Sievertsen
     *   email                : acyd.burn@gmx.de
     *
     *   $Id: download.php,v 1.39 2004/12/09 20:12:12 acydburn Exp $
     *
     *
     ***************************************************************************/

    /***************************************************************************
     *
     *   This program is free software; you can redistribute it and/or modify
     *   it under the terms of the GNU General Public License as published by
     *   the Free Software Foundation; either version 2 of the License, or
     *   (at your option) any later version.
     *
     ***************************************************************************/

    // Send file to browser
    function send_file_to_browser($attachment$upload_dir)
    {
        global 
    $_SERVER$HTTP_USER_AGENT$HTTP_SERVER_VARS$lang$db$attach_config;

        
    $filename = ($upload_dir == '') ? $attachment['physical_filename'] : $upload_dir '/' $attachment['physical_filename'];

        
    $gotit FALSE;

        if (!
    intval($attach_config['allow_ftp_upload']))
        {
            if (@!
    file_exists(@amod_realpath($filename)))
            {
                
    message_die(GENERAL_ERROR$lang['Error_no_attachment'] . "<br /><br /><b>404 File Not Found:</b> The File <i>" $filename "</i> does not exist.");
            }
            else
            {
                
    $gotit TRUE;
            }
        }

        
    //
        // Determine the Browser the User is using, because of some nasty incompatibilities.
        // Most of the methods used in this function are from phpMyAdmin. :)
        //
        
    if (!empty($_SERVER['HTTP_USER_AGENT'])) 
        {
            
    $HTTP_USER_AGENT $_SERVER['HTTP_USER_AGENT'];
        } 
        else if (!empty(
    $HTTP_SERVER_VARS['HTTP_USER_AGENT'])) 
        {
            
    $HTTP_USER_AGENT $HTTP_SERVER_VARS['HTTP_USER_AGENT'];
        }
        else if (!isset(
    $HTTP_USER_AGENT))
        {
            
    $HTTP_USER_AGENT '';
        }

        if (
    ereg('Opera(/| )([0-9].[0-9]{1,2})'$HTTP_USER_AGENT$log_version)) 
        {
            
    $browser_version $log_version[2];
            
    $browser_agent 'opera';
        } 
        else if (
    ereg('MSIE ([0-9].[0-9]{1,2})'$HTTP_USER_AGENT$log_version)) 
        {
            
    $browser_version $log_version[1];
            
    $browser_agent 'ie';
        } 
        else if (
    ereg('OmniWeb/([0-9].[0-9]{1,2})'$HTTP_USER_AGENT$log_version)) 
        {
            
    $browser_version $log_version[1];
            
    $browser_agent 'omniweb';
        } 
        else if (
    ereg('Netscape([0-9]{1})'$HTTP_USER_AGENT$log_version)) 
        {
            
    $browser_version $log_version[1];
            
    $browser_agent 'netscape';
        } 
        else if (
    ereg('Mozilla/([0-9].[0-9]{1,2})'$HTTP_USER_AGENT$log_version)) 
        {
            
    $browser_version $log_version[1];
            
    $browser_agent 'mozilla';
        } 
        else if (
    ereg('Konqueror/([0-9].[0-9]{1,2})'$HTTP_USER_AGENT$log_version)) 
        {
            
    $browser_version $log_version[1];
            
    $browser_agent 'konqueror';
        } 
        else 
        {
            
    $browser_version 0;
            
    $browser_agent 'other';
        }

        
    // Correct the mime type - we force application/octetstream for all files, except images
        // Please do not change this, it is a security precaution
        
    if (!strstr($attachment['mimetype'], 'image'))
        {
            
    $attachment['mimetype'] = ($browser_agent == 'ie' || $browser_agent == 'opera') ? 'application/octetstream' 'application/octet-stream';
        }

        
    // Now the tricky part... let's dance
    //    @ob_end_clean();
    //    @ini_set('zlib.output_compression', 'Off');
        
    header('Pragma: public');
    //    header('Content-Transfer-Encoding: none');

        // Send out the Headers
        
    header('Content-Type: ' $attachment['mimetype'] . '; name="' $attachment['real_filename'] . '"');
        
    header('Content-Disposition: inline; filename="' $attachment['real_filename'] . '"');

        
    //
        // Now send the File Contents to the Browser
        //
        
    if ($gotit)
        {
            
    $size = @filesize($filename);
            if (
    $size)
            {
                
    header("Content-length: $size");
            }
            
    readfile($filename);
        }
        else if (!
    $gotit && intval($attach_config['allow_ftp_upload']))
        {
            
    $conn_id attach_init_ftp();

            
    $ini_val = ( @phpversion() >= '4.0.0' ) ? 'ini_get' 'get_cfg_var';

            
    $tmp_path = ( !@$ini_val('safe_mode') ) ? '/tmp' $upload_dir '/tmp';
            
    $tmp_filename = @tempnam($tmp_path't0000');

            @
    unlink($tmp_filename);

            
    $mode FTP_BINARY;
            if ( (
    preg_match("/text/i"$attachment['mimetype'])) || (preg_match("/html/i"$attachment['mimetype'])) )
            {
                
    $mode FTP_ASCII;
            }

            
    $result = @ftp_get($conn_id$tmp_filename$filename$mode);

            if (!
    $result
            {
                
    message_die(GENERAL_ERROR$lang['Error_no_attachment'] . "<br /><br /><b>404 File Not Found:</b> The File <i>" $filename "</i> does not exist.");
            } 
        
            @
    ftp_quit($conn_id);

            
    $size = @filesize($tmp_filename);
            if (
    $size)
            {
                
    header("Content-length: $size");
            }
            
    readfile($tmp_filename);
            @
    unlink($tmp_filename);
        }
        else
        {
            
    message_die(GENERAL_ERROR$lang['Error_no_attachment'] . "<br /><br /><b>404 File Not Found:</b> The File <i>" $filename "</i> does not exist.");
        }

        exit;
    }
    --edit--
    achso... mit ftp-upload sollte es auch kein Problem mehr mit der 2MB-Grenze sein. Auch schon mal gelöst im Attachment-Mod ;-)
     
    Zuletzt bearbeitet: 11.08.2006
  4. mcnewbie

    mcnewbie Thread Starter MacUser Mitglied

    Beiträge:
    1.213
    Zustimmungen:
    5
    MacUser seit:
    09.08.2004
    werd mir das nachmittags zu gemüte führen, danke! (jetz grad was anderes zu tun :/ )
    .htaccess möchte ich nicht machen bzw wüsste ich nicht wie, da die user sich ja registrieren und in der datenbank stehen - od gibt es eine möglichkeit das zu verbinden?

    ich würde die db-option allerdings fast bevorzugen, die performance ist nicht so schlimm, da nicht wirklich viele user gleichzeitig zugreifen werden
     
    Zuletzt bearbeitet: 11.08.2006
  5. Manjo

    Manjo MacUser Mitglied

    Beiträge:
    903
    Zustimmungen:
    22
    MacUser seit:
    25.07.2005
    Ich meinte mit .htaccess, den direkten Zugriff auf das Verzeichnis grundsätzlich zu verbieten! Die Zugriffsberechtigung löst Du dann über Deine Userverwaltung in der DB, die Du in dem Skript, was die Dateien aus dem geschützten Verzeichnis liest und streamt, abfragst. Das php-Skript darf auch auf geschützte Verzeichnisse zugreifen. Die .htaccess brauchst Du nicht mehr anfassen.
     
  6. mcnewbie

    mcnewbie Thread Starter MacUser Mitglied

    Beiträge:
    1.213
    Zustimmungen:
    5
    MacUser seit:
    09.08.2004
    ah das klingt nach einer plausiblen alternative danke mal einstweilen!
     
Die Seite wird geladen...

Diese Seite empfehlen