Avatar billede Slettet bruger
23. maj 2010 - 21:14 Der er 8 kommentarer og
1 løsning

Upload mere end et billede ad gangen - applet eller ?

Hej eksperte!

Dette spørgsmål er blevet rørt flere gange på eksperten.dk og har efter lang tids søgen i både disse spørgsmål og resten af google ikke fået løst min hovedpine.

Jeg har en hjemmeside hvor uploading af billeder er vigtig. Jeg har nu lavet det så man kan uploade et billede som så bliver placeret i en mappe, med et tilhørende thumbnail der bliver smidt i en anden mappe på serveren. derudover bliver navnet på filen smidt i en database som relevante sider kan hente stien fra. dette fungere altsammen. problemet er at det oftest vil dreje sig om mange filer der skal uploades ad gangen og det har jeg ikke fundet en løsning på.

da jeg har søgt lidt har jeg både faldet over swfUpload som jeg ikke kunne få til at fungere- og heller ikke fundet en god guide til at opsætte. derufover er jeg faldet over de mere facebook-lignende java applets som jeg kun kan finde til penge som jeg ikke udmiddelbart er interesseret i at investere - især nr jeg er usikker på eventuelle resultater.

Hvad er den bedste løsning hvordan kommer jeg videre?

Synes det er mærkeligt at det skal være så svært? - burde være lige så nemt som at uploade et billede, eller hvad?

Beklager hvis i føler at det er et i forvejen besvaret spørgsmål - henvis gerne til det, hvis det er tilfældet.

Tak
Avatar billede majbom Novice
23. maj 2010 - 21:20 #1
nu nævner du selv swfupload, som jeg synes er fin til opgaven - jeg har brugt den flere gange - hvad er dit problem med at få den til virke?
Avatar billede Slettet bruger
23. maj 2010 - 23:27 #2
jeg forsøgte at downloade det fra hjemmesiden. fik mapperne samples og demos. Jeg vil gerne køre bruge den demo der hedder application, meen selvom demoen lader til at virker udseendes-mæssigt, så bliver billederne jo ikke gemt. Det regnede jeg egentlig heller ikke med, da jeg ikke har angvet nogen sti noget sted. men kan ikke finde et sted hvor det skal gøres?

Er det mig der er helt væk. ?
Avatar billede Slettet bruger
23. maj 2010 - 23:45 #3
i virkeligeheden ville det være fantastisk hvis du gad skrive (i korte ord) hvordan man griber en implementering an fra begyndelsen. har virkelig svært ved at regne ud.. virker ellers som et meget godt uploadsystem.
Avatar billede Slettet bruger
24. maj 2010 - 00:06 #4
nu kom jeg lidt videre ved at tilføje:

$fileName = md5(rand()*10000000) . ".jpg";
    move_uploaded_file($_FILES["Filedata"]["tmp_name"], "saved/" . $fileName);

til upload.php

nu gemmer den filerne, men skal så bare have strikket det sammen.

Hvis dette ikke er metoden - please let me know
Avatar billede Slettet bruger
24. maj 2010 - 00:57 #5
det der nu er problemet er at få gemt både et thumb og et real-size billede?

Ved du hvordan man gør det. Jeg kan gpdt få dem til at virke hver især. resize laver thumbs fint, men gemmer ikke original størelse - og omvendt med simpel.
Avatar billede majbom Novice
24. maj 2010 - 19:42 #6
hvad har du af kode?
Avatar billede Slettet bruger
24. maj 2010 - 20:49 #7
Jeg har forsøgt at kombinere de to upload scripts således:

<?php
/*
This is an upload script for SWFUpload that attempts to properly handle uploaded files
in a secure way.

Notes:
   
    SWFUpload doesn't send a MIME-TYPE. In my opinion this is ok since MIME-TYPE is no better than
    file extension and is probably worse because it can vary from OS to OS and browser to browser (for the same file).
    The best thing to do is content sniff the file but this can be resource intensive, is difficult, and can still be fooled or inaccurate.
    Accepting uploads can never be 100% secure.
   
    You can't guarantee that SWFUpload is really the source of the upload.  A malicious user
    will probably be uploading from a tool that sends invalid or false metadata about the file.
    The script should properly handle this.
   
    The script should not over-write existing files.
   
    The script should strip away invalid characters from the file name or reject the file.
   
    The script should not allow files to be saved that could then be executed on the webserver (such as .php files).
    To keep things simple we will use an extension whitelist for allowed file extensions.  Which files should be allowed
    depends on your server configuration. The extension white-list is _not_ tied your SWFUpload file_types setting
   
    For better security uploaded files should be stored outside the webserver's document root.  Downloaded files
    should be accessed via a download script that proxies from the file system to the webserver.  This prevents
    users from executing malicious uploaded files.  It also gives the developer control over the outgoing mime-type,
    access restrictions, etc.  This, however, is outside the scope of this script.
   
    SWFUpload sends each file as a separate POST rather than several files in a single post. This is a better
    method in my opinion since it better handles file size limits, e.g., if post_max_size is 100 MB and I post two 60 MB files then
    the post would fail (2x60MB = 120MB). In SWFupload each 60 MB is posted as separate post and we stay within the limits. This
    also simplifies the upload script since we only have to handle a single file.
   
    The script should properly handle situations where the post was too large or the posted file is larger than
    our defined max.  These values are not tied to your SWFUpload file_size_limit setting.
   
*/

// Code for to workaround the Flash Player Session Cookie bug
    if (isset($_POST["PHPSESSID"])) {
        session_id($_POST["PHPSESSID"]);
    } else if (isset($_GET["PHPSESSID"])) {
        session_id($_GET["PHPSESSID"]);
    }

    session_start();

// Check post_max_size (http://us3.php.net/manual/en/features.file-upload.php#73762)
    $POST_MAX_SIZE = ini_get('post_max_size');
    $unit = strtoupper(substr($POST_MAX_SIZE, -1));
    $multiplier = ($unit == 'M' ? 1048576 : ($unit == 'K' ? 1024 : ($unit == 'G' ? 1073741824 : 1)));

    if ((int)$_SERVER['CONTENT_LENGTH'] > $multiplier*(int)$POST_MAX_SIZE && $POST_MAX_SIZE) {
        header("HTTP/1.1 500 Internal Server Error"); // This will trigger an uploadError event in SWFUpload
        echo "POST exceeded maximum allowed size.";
        exit(0);
    }

// Settings
    $save_path = dirname(__FILENAME__) . "/saved/";                // The path were we will save the file (getcwd() may not be reliable and should be tested in your environment)
    $upload_name = "Filedata";
    $max_file_size_in_bytes = 2147483647;                // 2GB in bytes
    $extension_whitelist = array("jpg", "gif", "png");    // Allowed file extensions
    $valid_chars_regex = '.A-Z0-9_ !@#$%^&()+={}\[\]\',~`-';                // Characters allowed in the file name (in a Regular Expression format)
   
// Other variables   
    $MAX_FILENAME_LENGTH = 260;
    $file_name = "";
    $file_extension = "";
    $uploadErrors = array(
        0=>"There is no error, the file uploaded successfully",
        1=>"The uploaded file exceeds the upload_max_filesize directive in php.ini",
        2=>"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form",
        3=>"The uploaded file was only partially uploaded",
        4=>"No file was uploaded",
        6=>"Missing a temporary folder"
    );


// Validate the upload
    if (!isset($_FILES[$upload_name])) {
        HandleError("No upload found in \$_FILES for " . $upload_name);
        exit(0);
    } else if (isset($_FILES[$upload_name]["error"]) && $_FILES[$upload_name]["error"] != 0) {
        HandleError($uploadErrors[$_FILES[$upload_name]["error"]]);
        exit(0);
    } else if (!isset($_FILES[$upload_name]["tmp_name"]) || !@is_uploaded_file($_FILES[$upload_name]["tmp_name"])) {
        HandleError("Upload failed is_uploaded_file test.");
        exit(0);
    } else if (!isset($_FILES[$upload_name]['name'])) {
        HandleError("File has no name.");
        exit(0);
    }
   
// Validate the file size (Warning: the largest files supported by this code is 2GB)
    $file_size = @filesize($_FILES[$upload_name]["tmp_name"]);
    if (!$file_size || $file_size > $max_file_size_in_bytes) {
        HandleError("File exceeds the maximum allowed size");
        exit(0);
    }
   
    if ($file_size <= 0) {
        HandleError("File size outside allowed lower bound");
        exit(0);
    }


// Validate file name (for our purposes we'll just remove invalid characters)
    $file_name = preg_replace('/[^'.$valid_chars_regex.']|\.+$/i', "", basename($_FILES[$upload_name]['name']));
    if (strlen($file_name) == 0 || strlen($file_name) > $MAX_FILENAME_LENGTH) {
        HandleError("Invalid file name");
        exit(0);
    }


// Validate that we won't over-write an existing file
    if (file_exists($save_path . $file_name)) {
        HandleError("File with this name already exists");
        exit(0);
    }

// Validate file extension
    $path_info = pathinfo($_FILES[$upload_name]['name']);
    $file_extension = $path_info["extension"];
    $is_valid_extension = false;
    foreach ($extension_whitelist as $extension) {
        if (strcasecmp($file_extension, $extension) == 0) {
            $is_valid_extension = true;
            break;
        }
    }
    if (!$is_valid_extension) {
        HandleError("Invalid file extension");
        exit(0);
    }

// Validate file contents (extension and mime-type can't be trusted)
    /*
        Validating the file contents is OS and web server configuration dependant.  Also, it may not be reliable.
        See the comments on this page: http://us2.php.net/fileinfo
       
        Also see www.scanit.be/uploads/php-file-upload.pdf+php+file+command&hl=en&ct=clnk&cd=8&gl=us&client=firefox-a" target="_blank">http://72.14.253.104/search?q=cache:3YGZfcnKDrYJ:www.scanit.be/uploads/php-file-upload.pdf+php+file+command&hl=en&ct=clnk&cd=8&gl=us&client=firefox-a
        which describes how a PHP script can be embedded within a GIF image file.
       
        Therefore, no sample code will be provided here.  Research the issue, decide how much security is
        needed, and implement a solution that meets the need.
    */


// Process the file
    /*
        At this point we are ready to process the valid file. This sample code shows how to save the file. Other tasks
        could be done such as creating an entry in a database or generating a thumbnail.
       
        Depending on your server OS and needs you may need to set the Security Permissions on the file after it has
        been saved.
    */
    if (!@move_uploaded_file($_FILES[$upload_name]["tmp_name"], $save_path.$file_name)) {
        HandleError("File could not be saved.");
        exit(0);
    }

    exit(0);


/* Handles the error output. This error message will be sent to the uploadSuccess event handler.  The event handler
will have to check for any error messages and react as needed. */
function HandleError($message) {
    echo $message;
}
?>
<?php
    /* Note: This thumbnail creation script requires the GD PHP Extension. 
        If GD is not installed correctly PHP does not render this page correctly
        and SWFUpload will get "stuck" never calling uploadSuccess or uploadError
    */

    // Get the session Id passed from SWFUpload. We have to do this to work-around the Flash Player Cookie Bug
        // Work-around for setting up a session because Flash Player doesn't send the cookies
    if (isset($_POST["PHPSESSID"])) {
        session_id($_POST["PHPSESSID"]);
    }

    session_start();
    ini_set("html_errors", "0");
   
    // Check the upload
    if (!isset($_FILES["Filedata"]) || !is_uploaded_file($_FILES["Filedata"]["tmp_name"]) || $_FILES["Filedata"]["error"] != 0) {
        echo "ERROR:invalid upload";
        exit(0);
    }

    // Get the image and create a thumbnail
    $img = imagecreatefromjpeg($_FILES["Filedata"]["tmp_name"]);
    if (!$img) {
        echo "ERROR:could not create image handle ". $_FILES["Filedata"]["tmp_name"];
        exit(0);
    }

    $width = imageSX($img);
    $height = imageSY($img);

    if (!$width || !$height) {
        echo "ERROR:Invalid width or height";
        exit(0);
    }

    // Build the thumbnail
    $target_width = 100;
    $target_height = 100;
    $target_ratio = $target_width / $target_height;

    $img_ratio = $width / $height;

    if ($target_ratio > $img_ratio) {
        $new_height = $target_height;
        $new_width = $img_ratio * $target_height;
    } else {
        $new_height = $target_width / $img_ratio;
        $new_width = $target_width;
    }

    if ($new_height > $target_height) {
        $new_height = $target_height;
    }
    if ($new_width > $target_width) {
        $new_height = $target_width;
    }

    $new_img = ImageCreateTrueColor(100, 100);
    if (!@imagefilledrectangle($new_img, 0, 0, $target_width-1, $target_height-1, 0)) {    // Fill the image black
        echo "ERROR:Could not fill new image";
        exit(0);
    }

    if (!@imagecopyresampled($new_img, $img, ($target_width-$new_width)/2, ($target_height-$new_height)/2, 0, 0, $new_width, $new_height, $width, $height)) {
        echo "ERROR:Could not resize image";
        exit(0);
    }

    if (!isset($_SESSION["file_info"])) {
        $_SESSION["file_info"] = array();
    }

    // Use a output buffering to load the image into a variable
    ob_start();
    imagejpeg($new_img);
    $imagevariable = ob_get_contents();
    ob_end_clean();
   
    $fileName = md5(rand()*10000000) . ".jpg";
    move_uploaded_file($_FILES["Filedata"]["tmp_name"], "thumbs/" . $fileName);
    $file_id = md5($_FILES["Filedata"]["tmp_name"] + rand()*100000);
   
    $_SESSION["file_info"][$file_id] = $imagevariable;

    echo "FILEID:" . $file_id;    // Return the file id to the script
   
?>

Men det lader til at afhænge også af index.php koden (eller koden som kalder på uploadscriptet), for det er kun den ene af de to der synes at reagere.
Avatar billede majbom Novice
04. november 2010 - 13:49 #8
kom du videre?
Avatar billede Slettet bruger
05. november 2010 - 01:09 #9
Nej jeg fandt en anden løsning - sorry jeg ikke svarede
- ikke helt optimalt... men sådan er det.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester