Gustl: wo steckt das tempfile beim upload

bin schon wieder ganz tralala im kopf. nach dem upload, aber bevor ich das file an die von mir festgelegte stelle kopiere will ich die datei mit file::type prüfen. ich hab die beiden werte:

my $filename = $q->param("incoming");  
my $handle = $q->upload("incoming");

....

my $ft = File::Type->new();  
my $type = $ft->mime_type(???);
hier fehlerprüfung wenn mime-type falsch, wenns passt dann schreiben
open (FILE, ">../$dest/$filename") or die "Can't create file: $!";  
my $buffer;  
while (read($handle,$buffer,2048)) { print FILE $buffer; } close (FILE);

was schreib ich bei der fileprüfung für einen path (???) rein? in $handle steht bei mir auch nur der nackte dateiname, also nichts anderes wie in $filename. file::type findet aber nichts.

die selbe prüfung mit der gleichen datei geht, wenn die datei erst mal da liegt wo ich sie haben will. da ist es aber zu spät für die prüfung.

  • Gustl
  1. es ist als könnte file::type die tempdatei nicht zum lesen öffnen. die grösse der datei kann ich einwandfrei ermitteln, an der selben stelle.

    • Gustl
    1. Ich würde ja auf den temporären Ordner tippen. Ansonsten könnte hilfreich sein nach dem OS und nach der Umgebung (%ENV) zu schauen.

      1. kann das sein dass nur das aktuell ausführende script die leserechte an der tempdatei hat und die moduleinbindung diese rechte nicht an das modul vererbt? dann kann ich versuchen was ich will, eine fileprüfung per modul nach dem upload aber vor dem kopieren nach dest wird nicht möglich sein.

        ich kann versuchen was ich will, sobald ich versuche den mime_type per (irgendeinem) modul zu analysieren kommt nichts mehr zurück.

        dann schreibe ich nach dest, analysiere das file (denn ab da gehts plötzlich) und wenns nicht passt lösche ich das file wieder. das ist keine elegante und auch keine sichere lösung, aber wenns nicht anders möglich ist ...

        • Gustl
        1. ich kann versuchen was ich will, sobald ich versuche den mime_type per (irgendeinem) modul zu analysieren kommt nichts mehr zurück.

          Und? Kennt denn Dein "modul" alle benötigten Variablen?

  2. An deinem Code kann ich sehen, dass du aus einer schlechten/veralteten Quelle lernst. Ersetze sie durch etwas modernes, damit du guten Code schreibst.

    In https://forum.selfhtml.org/?t=212104&m=1448606 habe ich dir schon das besseres Modul File::LibMagic zur Inhaltserkennung empfohlen, benutze es.

    Du brauchst nicht manuell umpuffern, um eine Datei zu kopieren. Benutze File::Copy, es kann mit Handles umgehen.

    #!/usr/bin/env perl  
    use CGI qw();  
    use Fcntl qw(SEEK_SET);  
    use File::Copy qw(cp);  
    use File::LibMagic qw();  
    use autodie qw(cp);  
      
    my $cgi = CGI->new;  
    my $handle = $cgi->upload('incoming')->handle;  
    $handle->read(my $buffer, 4*1024);  
      
    $cgi->print(  
        $cgi->header('text/plain'),  
        sprintf  
            "Client type: %s\nServer detected type: %s\n",  
            $cgi->uploadInfo($cgi->param('incoming'))->{'Content-Type'},  
            File::LibMagic->new->checktype_contents($buffer)  
    );  
      
    seek($handle, 0, SEEK_SET);  
    cp $handle, '/tmp/foobar';  
    
    
    1. In https://forum.selfhtml.org/?t=212104&m=1448606 habe ich dir schon das besseres Modul File::LibMagic zur Inhaltserkennung empfohlen, benutze es.

      ich krieg LibMagic nicht zum laufen. muss aber dazusagen dass ich meine pm´s in nem anderen verzeichnis habe. mein ehemaliger serveradmin hat mal das passwort geändert und dann ging er nach indien ohne tschüss zu sagen. ich komm nicht übers putty rauf. der serververmieter ist vermutlich schon so genervt von mir, dass er mir meine mails nicht mehr beantwortet. der hat mir nämlich sonst immer meine module installiert, nachdem xy nach indien verschwand. hab mich mit dem rootserver früher nie beschäftigt, kenn mich auch nicht damit aus und wollte das auch nicht wissen. so ist das halt jetzt.

      ich mach das z.b. so:

      use lib '/var/kirsche/apfel/birne/domainuser/pm';
      (in pm liegt Type.pm)
      use Type;

      mit den einfachen modulen geht das problemlos und ich kann auch mal schnell per ftp in den code kucken und dran rumbasteln.

      ich brauche eigentlich nur eine fileprüfung der mime_types flv und mp4. kopfzerbrechen macht mir nur mp4, weils da anscheinend verschiedene gibt. flv wird sogar ganz normal über upload-info erkannt. flowplayer bzw. halt flashplayer spielt z.b. keine video/quicktime (mmp41 und mmp42) ab, aber das sind auch *.mp4.

      das ist alles mist. wenn ich mehr über den dateikopf dieser beiden formate wüsste, könnte ich mir die fileprüfung ganz einfach selber schreiben. ich bräuchte nicht mal ein modul. die module machen ja auch keine zauberei. sie lesen nur den dateikopf und kucken nach typischen vorkommen. nachdem bestimmen sie den mimetype. die dinger kann man leicht überlisten wenn man weiss wonach sie prüfen.

      • Gustl
      1. Mir rollen sich die Zehennägel auf ob deiner Geschichten.

        ich krieg LibMagic nicht zum laufen.

        Ja und? War das jetzt alles? Hast du einfach aufgegeben? Falls ja, warum?
        Falls nein, weshalb teilst du nicht deine bisherigen Beobachtungen mit und lieferst eine vernünftige Fehlerbeschreibung?

        muss aber dazusagen dass ich meine pm´s in nem anderen verzeichnis habe.

        Das ist mir und Perl egal.

        mein ehemaliger serveradmin hat mal das passwort geändert und dann ging er nach indien ohne tschüss zu sagen.

        Warum hast du nicht das Passwort zurücksetzen lassen? Falls du nicht fähig bist, zu administrieren, warum gibt es keinen Nachfolger?

        ich brauche eigentlich nur eine fileprüfung der mime_types flv und mp4.

        Warum hast du diese wesentliche Information so lange vorenthalten?

        kopfzerbrechen macht mir nur mp4, weils da anscheinend verschiedene gibt.

        MP4 ist ein Containerformat. Es sagt erst mal nichts über den Inhalt aus. Lerne über Container und Codecs, dann werde dir klar darüber, was du wirklich filtern willst.

        das ist alles mist.

        Ich teile diese Einschätzung nicht. Der Mangel an Wissen und Kompetenz liegt allein bei dir. Stelle Fragen, lies mehr, bilde dich!

        wenn ich mehr über den dateikopf dieser beiden formate wüsste, könnte ich mir die fileprüfung ganz einfach selber schreiben.

        Dann tu es doch. Das Suchwort lautet „specification“ oder „spec“; so ein Dokument legt fest, wie ein Format aufgebaut ist.

        Weil file(1)/libmagic(3) aber schon wunderbar funktionieren, würden sich die meisten Leute würden sich nicht bemühen, diesen Code zu duplizieren.

        PS: Das waren keine rhetorischen Fragen.

        1. Mir rollen sich die Zehennägel auf ob deiner Geschichten.

          daran möchte ich nicht schuld sein :-)

          ich such mir schon wieder einen admin. aber die, die ich kenne sind alle noch viel fauler als ich.

          keine panik, schreiben ist für mich nur hobby.

          • Gustl
  3. Moin,

    alles was Du brauchst, steht in der Dokumentation Deiner Module. So gibt es in CGI.pm die Methode tmpFileName(). Falls Du an File::Type festhalten möchtest, da gibt es Methoden, welche entweder einen Dateinamen erwarten oder den Inhalt, wobei checktype_filename auch nur 16*1024 aus der Datei liest.

    Hotti