datei upload in mysql db!?

  1. mcnewbie

    mcnewbie Thread StarterMacUser Mitglied

    Mitglied seit:
    09.08.2004
    Beiträge:
    1.215
    Zustimmungen:
    5
    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! ;)
     
    mcnewbie, 11.08.2006
  2. wegus

    wegusMacUser Mitglied

    Mitglied seit:
    13.09.2004
    Beiträge:
    14.982
    Zustimmungen:
    1.545
    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.
     
    wegus, 11.08.2006
  3. Manjo

    ManjoMacUser Mitglied

    Mitglied seit:
    25.07.2005
    Beiträge:
    903
    Zustimmungen:
    22
    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 ;-)
     
    Manjo, 11.08.2006
  4. mcnewbie

    mcnewbie Thread StarterMacUser Mitglied

    Mitglied seit:
    09.08.2004
    Beiträge:
    1.215
    Zustimmungen:
    5
    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
     
    mcnewbie, 11.08.2006
  5. Manjo

    ManjoMacUser Mitglied

    Mitglied seit:
    25.07.2005
    Beiträge:
    903
    Zustimmungen:
    22
    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.
     
    Manjo, 11.08.2006
  6. mcnewbie

    mcnewbie Thread StarterMacUser Mitglied

    Mitglied seit:
    09.08.2004
    Beiträge:
    1.215
    Zustimmungen:
    5
    ah das klingt nach einer plausiblen alternative danke mal einstweilen!
     
    mcnewbie, 11.08.2006
Die Seite wird geladen...
Ähnliche Themen - datei upload mysql
  1. jeremyex
    Antworten:
    0
    Aufrufe:
    414
    jeremyex
    02.11.2016
  2. Rothlicht
    Antworten:
    5
    Aufrufe:
    523
  3. meista
    Antworten:
    1
    Aufrufe:
    754
  4. Tundra
    Antworten:
    8
    Aufrufe:
    1.349
  5. mores
    Antworten:
    13
    Aufrufe:
    1.361
    PowerBookGrafik
    14.07.2006