tutorials.de Buch-Aktion 05/2012
Like Tree3Danke
  • 1 Beitrag von CPoly
  • 1 Beitrag von CPoly
  • 1 Beitrag von CPoly
ERLEDIGT
NEIN
ANTWORTEN
13
ZUGRIFFE
397
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Purdey Purdey ist offline Mitglied Bronze
    Registriert seit
    Sep 2007
    Beiträge
    42
    Hallo Zusammen,

    ich habe eine Array files[] welches seine Werte durch mehrere input type=file felder erhält

    Füge ich eine Datei hinzu so wird danach das input Feld geklont
    ich würde nun gern wenn möglich alle sich bereits im Array befindlichen Daten gegen den neu dazukommenden Filenamen prüfen und somit aus der Vorgabe:

    1. Datei: 1.JPG
    2. Datei: 3.JPG
    3. Datei: 1.JPG

    Beim hinzufügen von Datei 3 feststellen lassen und nen Fehler ausgeben, das die Datei bereits schon ausgewählt wurde. Könnt ihr mir sagen ob das möglich ist? Mir eventuell Hilfe & Tipps anbieten?
     

  2. #2
    CPoly CPoly ist gerade online Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Im Prinzip musst du doch nur das Array durchlaufen und die Namen prüfen. Das ganze in O(n).

    Code javascript:
    1
    2
    3
    4
    5
    6
    7
    
    var newName = '1.JPG';
     
    for(var i = 0; i < files.length; i++) {
        if(files[i] == newName) {
            alert('Bereits enthalten');
        }
    }

    Bei großen Arrays wird das ganze eventuell irgendwann langsam. Deshalb könntest du die Namen der Dateien parallel zum Array in einem Objekt merken.

    Code javascript:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    //Das Objekt sollte parallel zum Array immer die aktuellen Namen enthalten
    var names = {};
    var files = [];
     
    var newName = '1.JPG';
     
    if(names[newName] === 1) {
        alert('Bereits enthalten');
    } else {
        names[newName] = 1;
        files.push(newName);
    }
     

  3. #3
    Purdey Purdey ist offline Mitglied Bronze
    Registriert seit
    Sep 2007
    Beiträge
    42
    hallo CPoly vielen Dank für die schnelle Antwort, kann ich das auch zur Laufzeit machen?
    Also ich wähle die Datei aus und schon sagt er das es net passt?
     

  4. #4
    CPoly CPoly ist gerade online Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Der erste Code den ich gepostet hab macht ja genau das. Den kannst du nach der Auswahl einer Datei ausführen und gucken ob diese bereits in dem Array ist.
     

  5. #5
    Purdey Purdey ist offline Mitglied Bronze
    Registriert seit
    Sep 2007
    Beiträge
    42
    Ich habe den Code zu Testweise in mein bisheriges Projekt eingefügt:
    Leider klappt es noch nicht, kannst du mal schauen?

    <?php

    //include_once('../../sessionhelpers.inc.php');

    if($_POST['files'])
    {

    $array=$_POST['files'];
    foreach($array as $files)
    {



    if(strlen($files)>0)
    {
    echo '<h3>'.$files.'<h3/>';
    //$sql=mysql_query("insert into ticket_uploads (ticket_id, ticket_datei) values('666','$files')");

    }
    }



    }

    ?>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <script type="text/javascript" src="http://ajax.googleapis.com/
    ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    <script type="text/javascript" src="reCopy.js"></script>
    <script type="text/javascript">
    $(function(){


    $('.inputf:last').each(function(){
    $(this).bind('change', function() {
    var ext = $('.inputf:last').val().split('.').pop().toLowerCase();
    // Array gibt -1 zurück wenn das Element nicht gefunden wurde
    // gibt eine Zahl größer 0 zurück wenne es an der Stelle gefunden
    // Position 1 gibt 0 zurück, Position 2 gibt 1 zurück

    var erg = $.inArray(ext, ['gif','png','jpg','jpeg']);
    //alert(erg);


    // Hier soll der Code testweise laufen
    var newName = this.files[0].name;

    for(var i=0; i < files.length; i++) {
    if(files[i] == newName) {
    alert('Bereits enthalten');
    }
    }



    // Ist der Wert -1 nicht zulassen --> Element wurde nicht gefunden
    if (erg == -1) {
    alert("Datei wird nicht zugelassen");
    //Feld leeren
    $(this).val("");
    }

    // Ist der Wert größer --> Element wurde gefunden und wird zugelassen
    else if (ext > '-1') {
    alert("Datei wird zugelassen");

    var filesize=this.files[0].size;
    var maxfilesize=2621440;

    if (filesize > maxfilesize) {
    alert('Die gewählte Datei ist größer als die vorgabe für die Dateigröße');
    //Feld leeren
    $(this).val("");
    }
    else {
    alert('Die gewählte Datei und deren größe überschreiten das Limit nicht und werden zulassen.');

    // Zeige Link mehr Uploads an
    $('a.add').css({visibility: "visible"},1000);
    }





    }

    else {
    alert("Datei wird nicht zugelassen");
    }


    });

    });



    var removeLink = ' <a class="remove" href="#" onclick="$(this).parent().fadeOut(function(){ $(this).remove() }); return false">-</a>';
    $('a.add').relCopy({ append: removeLink});
    });



    </script>
    <style type="text/css">
    body{ font-family:Arial, Helvetica, sans-serif; font-size:13px; }
    .remove {color:#cc0000; text-decoration:none;}
    .add {color:#cc0000; text-decoration:none; visibility:hidden;}
    .plus {}
    .input{ border: solid 1px #006699; padding:0px; text-decoration:none;}

    </style>
    </head>

    <body>
    <form method="post" action="">
    <p class="clone"> <input type="file" name="files[]" class="inputf"/></p>
    <p><a href="#" class="add" rel=".clone">+</a></p>
    <input type="submit" value="Senden" />

    </form>
    </body>
    </html>
     

  6. #6
    CPoly CPoly ist gerade online Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    "this.files" und nicht "files". Außerdem "files[i].name" und nicht nur "files[i]"

    Code javascript:
    1
    2
    3
    4
    5
    
    for(var i=0; i < this.files.length; i++) {
        if(this.files[i].name == newName) {
            alert('Bereits enthalten');
        }
    }
     

  7. #7
    Purdey Purdey ist offline Mitglied Bronze
    Registriert seit
    Sep 2007
    Beiträge
    42
    Vielen Dank mit den Anpassungen passt es nur eine Kleinigkeit ist noch offen.
    Wenn ich es jetzt ausführe sagt er mir jedes mal das die Datei "bereits enthalten" ist, selbst bei der ersten Datei, wie kann ich das noch umgehen?
     

  8. #8
    CPoly CPoly ist gerade online Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Naja, das Problem ist, dass die Datei ja tatsächlich in dem Array drin ist, also muss die Überprüfung immer wahr sein. Du müsstest also nebenher in einer weiteren Variablen alle tatsächlich akzeptierten Dateien speichern.

    Setz bitte mal den Code in [javascript] tags und rück ihn korrekt ein. Dann bau ich dir das da rein.
    Purdey bedankt sich. 

  9. #9
    Purdey Purdey ist offline Mitglied Bronze
    Registriert seit
    Sep 2007
    Beiträge
    42
    Ich hoffe das passt so, könnten wir das dann gleich noch an der richtigen Stelle einbasteln,
    wenn es erfüllt ist soll es "weiter" gehen und der $('a.add').relCopy({ append: removeLink}); angezeigt werden, wenn nicht dann sollte das inputfeld gelert werden $(this).val("");

    Code javascript:
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    
     
    <?php
     
    //include_once('../../sessionhelpers.inc.php');
     
    if($_POST['files'])
    {
     
    $array=$_POST['files'];
    foreach($array as $files)
    {
     
     
     
    if(strlen($files)>0)
    {
    echo '<h3>'.$files.'<h3/>';
    //$sql=mysql_query("insert into ticket_uploads (ticket_id, ticket_datei) values('666','$files')");
     
    }
    }
     
     
     
    }
     
    ?>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <script type="text/javascript" src="http://ajax.googleapis.com/
    ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    <script type="text/javascript" src="reCopy.js"></script>
    <script type="text/javascript">
    $(function(){
     
     
    $('.inputf:last').each(function(){
        $(this).bind('change', function() {
            var ext = $('.inputf:last').val().split('.').pop().toLowerCase();
        // Array gibt -1 zurück wenn das Element nicht gefunden wurde
        // gibt eine Zahl größer 0 zurück wenne es an der Stelle gefunden
        // Position 1 gibt 0 zurück, Position 2 gibt 1 zurück
        
        var erg = $.inArray(ext, ['gif','png','jpg','jpeg']);
        //alert(erg);
     
     
     
    var newName=this.files[0].name;
     
    alert(newName);
     
    for(var i=0; i < this.files.length; i++) {
        if(this.files[i].name == newName) {
            alert('Bereits enthalten');
        }
    }
        
        // Ist der Wert -1 nicht zulassen --> Element wurde nicht gefunden
        if (erg == -1) {
            alert("Datei wird nicht zugelassen");
            //Feld leeren
            $(this).val("");
        }
     
        // Ist der Wert größer --> Element wurde gefunden und wird zugelassen
        else if (ext > '-1') {
            alert("Datei wird zugelassen");
            
            var filesize=this.files[0].size;
            //var maxfilesize=3145728;
            var maxfilesize=2621440;
                  
            //alert(filesize);
            //alert(maxfilesize);
            
                if (filesize > maxfilesize) {
                alert('Die gewählte Datei ist größer als die vorgabe für die Dateigröße');
                //Feld leeren
                $(this).val("");
                }
                else {
                alert('Die gewählte Datei und deren größe überschreiten das Limit nicht und werden zulassen.');
     
        // Zeige Link mehr Uploads an   
                $('a.add').css({visibility: "visible"},1000);
                } 
     
     
     
            
            
        }  
        
        else {
            alert("Datei wird nicht zugelassen");
        }   
                
                
        });
     
    });
     
     
     
      var removeLink = ' <a class="remove" href="#" onclick="$(this).parent().fadeOut(function(){ $(this).remove() }); return false">-</a>';
    $('a.add').relCopy({ append: removeLink});  
    });
     
     
     
    </script>
    <style type="text/css">
    body{ font-family:Arial, Helvetica, sans-serif; font-size:13px; }
    .remove {color:#cc0000; text-decoration:none;}
    .add {color:#cc0000; text-decoration:none; visibility:hidden;}
    .plus {}
    .input{ border: solid 1px #006699; padding:0px; text-decoration:none;}
     
    </style>
    </head>
     
    <body>
       <form method="post" action="">
       <p class="clone"> <input type="file" name="files[]" class="inputf"/></p>
       <p><a href="#" class="add" rel=".clone">+</a></p>
       <input type="submit" value="Senden" />
       
       </form>
    </body>
    </html>
    Geändert von Purdey (18.07.11 um 21:16 Uhr)
     

  10. #10
    CPoly CPoly ist gerade online Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Viel Spaß. Dieses relCopy Plugin brauchst du auch nicht mehr.

    HTML-Code:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
    <head>
    	<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    	
    	<title>Upload form</title>
    </head>
    
    <body>
    	<form method="post" action="">
    		<p class="clone"><input type="file" name="files[]" class="inputf" /></p>
    		<p><a href="#" class="add" rel=".clone">+</a></p>
    		<p><input type="submit" value="Senden" /></p>
    	</form>
    	
    	<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js"></script>
    	<script type="text/javascript">
    	/* <![CDATA[ */
    	$(function () {
    		//Neues input hinzufügen
    		var btnAdd = $('.add').hide().click(function(e) {
    			e.preventDefault();
    			
    			var last = $('.clone:last');
    			var clone = last.clone().find(':input').val('').end().filter(':not(:has(.remove))').append('<a class="remove" href="#">-</a>').end();
    			
    			last.after(clone);
    			
    			$(this).hide();
    		});
    		
    		//Input löschen
    		$('.remove').live('click', function(e) {
    			e.preventDefault();
    			
    			$(this).parent().fadeOut(function(){
    				$(this).remove()
    			});
    		});
    		
    		
    		//Alle erlaubten Dateiendungen
    		var extensions = ['gif', 'png', 'jpg', 'jpeg'];
    	
    		//Maximale Dateigröße
    		var maxFilesize = 2621440;
    	
    		//change-event für alle jetzigen und Zukünftigen Elemente binden
    		$('.inputf').live('change', function() {
    		
    			var ext = this.value.split('.').pop().toLowerCase();
    		
    			//Dateiendung prüfen
    			if( $.inArray(ext, extensions) === -1 ) {
    				alert('Dateiendung nicht zugelassen');
    			
    				this.value = '';
    				return;
    			}
    		
    			//Dateigröße prüfen
    			if( this.files[0].size > maxFilesize ) {
    				alert('Datei zu groß');
    			
    				this.value = '';
    				return;
    			}
    		
    			//Prüfen ob bereits vorhanden
    			var newName = this.files[0].name;
    		
    			var inputsWithSameFile = $('.inputf').filter(function() {
    				return this.value === newName;
    			});
    		
    			//Wenn es mehr als ein input mit der gleichen Datei gibt (eines gibt es ja mindestens ;) )
    			if( inputsWithSameFile.size() > 1 ) {
    				alert('Datei bereits ausgewählt');
    			
    				this.value = '';
    				return;
    			}
    			
    			//Wenn noch leere file-inputs da sind, bleibt der add-button unsichtbar
    			if( $('.inputf[val=]').size() > 0 ) {
    				btnAdd.hide();
    			} else {
    				btnAdd.show();
    			}
    			
    			//Alle Prüfungen sind erfolgreich durchlaufen
    			alert('Datei wird akzeptiert!');
    		});
    	});
    	/* ]]> */
    	</script>
    
    </body>
    
    </html>
    Purdey bedankt sich. 

  11. #11
    Purdey Purdey ist offline Mitglied Bronze
    Registriert seit
    Sep 2007
    Beiträge
    42
    EDIT:

    im Firefox 4 klappt alles, im IE 9 kann ich leider nur eine Datei hochladen und im GoogleChrome zählt er nicht die Dateien hoch, woran könnte das liegen?

    Hi nochmals vielen Dank ist echt schick und auch ohne das JS Plugin nur leider ist inputsWithSameFile.size() immer null, da das Script an dieser Stelle nicht klappte habe ich nochmals paar Daten in einer alert() ausgeben lassen dabei scheint inputsWithSameFile.size() immer "0" zu sein. Ansonsten ist es echt perfekt. Schon mal danke sehr!

    Lässt sich dieser kleine Fehler noch finden?

    HTML-Code:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
    <head>
    	<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    	
    	<title>Upload form</title>
    </head>
    
    <body>
    	<form method="post" action="">
    		<p class="clone"><input type="file" name="files[]" class="inputf" /></p>
    		<p><a href="#" class="add" rel=".clone">+</a></p>
    		<p><input type="submit" value="Senden" /></p>
    	</form>
    	
    	<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js"></script>
    	<script type="text/javascript">
    	/* <![CDATA[ */
    	$(function () {
    		//Neues input hinzufügen
    		var btnAdd = $('.add').hide().click(function(e) {
    			e.preventDefault();
    			
    			var last = $('.clone:last');
    			var clone = last.clone().find(':input').val('').end().filter(':not(:has(.remove))').append('<a class="remove" href="#">-</a>').end();
    			
    			last.after(clone);
    			
    			$(this).hide();
    		});
    		
    		//Input löschen
    		$('.remove').live('click', function(e) {
    			e.preventDefault();
    			
    			$(this).parent().fadeOut(function(){
    				$(this).remove()
    			});
    		});
    		
    		
    		//Alle erlaubten Dateiendungen
    		var extensions = ['gif', 'png', 'jpg', 'jpeg'];
    	
    		//Maximale Dateigröße
    		var maxFilesize = 2621440;
    	
    		//change-event für alle jetzigen und Zukünftigen Elemente binden
    		$('.inputf').live('change', function() {
    		
    			var ext = this.value.split('.').pop().toLowerCase();
    		
    			//Dateiendung prüfen
    			if( $.inArray(ext, extensions) === -1 ) {
    				alert('Dateiendung nicht zugelassen');
    			
    				this.value = '';
    				return;
    			}
    		
    			//Dateigröße prüfen
    			if( this.files[0].size > maxFilesize ) {
    				alert('Datei zu groß');
    			
    				this.value = '';
    				return;
    			}
    		
    			//Prüfen ob bereits vorhanden
    			var newName = this.files[0].name;
    		
                            alert(newName);                        
    
    
    			var inputsWithSameFile = $('.inputf').filter(function() {
    
                            alert(this.value);
    				return this.value === newName;
    			});
    		
                           alert(inputsWithSameFile.size());
    
    
    			//Wenn es mehr als ein input mit der gleichen Datei gibt (eines gibt es ja mindestens ;) )
    			if(inputsWithSameFile.size() > 1 ) {
    				alert('Datei bereits ausgewählt');
    			
    				this.value = '';
    				return;
    			}
    			
    			//Wenn noch leere file-inputs da sind, bleibt der add-button unsichtbar
    			if( $('.inputf[val=]').size() > 0 ) {
    				btnAdd.hide();
    			} else {
    				btnAdd.show();
    			}
    			
    			//Alle Prüfungen sind erfolgreich durchlaufen
    			alert('Datei wird akzeptiert!');
    		});
    	});
    	/* ]]> */
    	</script>
    
    </body>
    
    </html>
    Geändert von Purdey (19.07.11 um 09:43 Uhr)
     

  12. #12
    CPoly CPoly ist gerade online Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Ich hätte das vielleicht von Anfang an sagen sollen. Das Arbeiten mit dem file-input in JavaScript ist ein Krampf. Manche Browser lassen keinen Zugriff auf das value Attribut zu, also funktioniert das Leeren nicht. Des weiteren ist das "files" Objekt etwas HTML5 spezifisches, das heißt die Überprüfung von Dateigröße und Duplikaten funktioniert auch nicht in jedem Browser. (Siehe "File API" http://en.wikipedia.org/wiki/Compari...specifications)



    Vielleicht hilft es dir ja, wenn ich dich auf Alternativen Hinweise:
    http://www.plupload.com/
    http://swfupload.org/
     

  13. #13
    Purdey Purdey ist offline Mitglied Bronze
    Registriert seit
    Sep 2007
    Beiträge
    42
    Hi vielen Dank für die viele und gute Arbeit, naja gut hauptsächlich soll es ja im Firefox laufen, daher sollte es passen. Zwar etwas schade aber der Code läuft im FF ja richtig prima. Ist damit zu rechnen, das andere Browser mal nach ziehen werden?
     

  14. #14
    CPoly CPoly ist gerade online Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Zitat Zitat von Purdey Beitrag anzeigen
    Ist damit zu rechnen, das andere Browser mal nach ziehen werden?
    Ja, früher oder später.

    Wenn es dir nur um neuere Browser geht, dann solltest du das mal testen. Jetzt kannst du direkt mehrere Dateien mit einem input auswählen.

    HTML-Code:
    <!DOCTYPE html>
    <html>
    <head>
    	<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    	
    	<title>Upload form</title>
    </head>
    
    <body>
    	<form method="post" action="">
    		<p><input type="file" name="files[]" class="inputf" multiple="multiple" /></p>
    		<p><input type="submit" value="Senden" /></p>
    	</form>
    </body>
    
    </html>
    Purdey bedankt sich. 

Ähnliche Themen

  1. PHP Array mittels JQuery ausgeben
    Von Purdey im Forum Javascript & Ajax
    Antworten: 5
    Letzter Beitrag: 23.04.11, 20:04
  2. Antworten: 3
    Letzter Beitrag: 20.10.10, 20:47
  3. Antworten: 9
    Letzter Beitrag: 22.07.10, 15:51
  4. Antworten: 3
    Letzter Beitrag: 12.07.10, 13:27
  5. jQuery: jQuery auf AJAX Response anwenden
    Von pointsdächster im Forum Javascript & Ajax
    Antworten: 3
    Letzter Beitrag: 12.04.10, 01:15

Stichworte