Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]284[/thread]

Datei mit unbekannter Extension suchen...: ...und mit MIME:Lite verschicken

Leser: 1


<< |< 1 2 >| >> 19 Einträge, 2 Seiten
cbxk1xg
 2004-06-06 23:07
#2761 #2761
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Hallo Freunde der Sonne,

ich hab folgendes kleines Problem. Bei meinem Uploadscript wird eine SessionID erzeugt und die hochgeladene Datei bekommt so z.B. den Namen 74535.jpg oder 74535.pdf, 74535.zip, etc. Da ich nun nicht weiss, welche Extension die Datei wirklich hat hilft mir ein einfaches -e leider nicht weiter. (Das Uploadscript ist getrennt vom E-Mailscript.)

Ich will diese Datei dann per E-Mail mit MIME:Lite verschicken und nach dem erfolgerichen verschicken löschen. Letzteres sollte mit unlink kein Problem sein. Aber ich bin mir auch nicht sicher, ob MIME:Lite die Datei richtig encodet.

Bisher habe ich folgendes:
Code (perl): (dl )
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
$msg = MIME::Lite->new( 
        From    =>"$CompanyName <$CompanyEmail>",
        To      =>"$CompanyName <$CompanyEmail>",
        Cc      =>'',
        Subject =>"Nachricht von $company",
        Type    =>'multipart/mixed'
        );

$msg->attach(Type => 'text/html',
Data => qq
{
blah, blah... siehe Anhang.
}
);


# Verzeichnis öffnen und Inhalt in @files speichern
opendir DIR, "$TEMP_DIR/" or &file_error("Unable to open directory. $!");
readdir DIR for 0 .. 1;
@files = grep -f "$TEMP_DIR/$_", readdir DIR;
closedir DIR;

# Datei in @files suchen
        foreach $_ (@files)
        {
        $AttachentFile = (split /\./, $_)[0];
        grep /$AttachentFile/i, @files;
        }

# Extension von der gesuchen Datei bestimmen.
my $ext = (split /\./, $AttachentFile)[1];

my $MailAttachment = "$TEMP_DIR/$SessionID$ext";
if (!-e $MailAttachment) {&program_error("Keine Datei vorhanden. $!");}

# Das sollte den Content-type selbständig bestimmen.
$MIME::Lite::AUTO_CONTENT_TYPE = 1;

# Attachment anängen, umbennen, Mail abschicken.
$msg->attach(
        Type        =>'auto',
        Path        =>"$MailAttachment",
        Filename    =>"picture$ext",
        Disposition =>'attachment'
        );

$msg->send;
jemand
 2004-06-06 23:45
#2762 #2762
User since
2004-05-14
231 Artikel
BenutzerIn
[default_avatar]
hi,
ich versteh dein problem jetzt nicht ganz
du musst doch ehh wissen welche sessionid die datei hat also schreib halt einfach id und endung in ne datei aus der dann des vom mailskript ausgelesen wird...
du kannst natürlich auch ein @rray von readdir sortieren und den eintrag mit der höchsten id auslesen...
print uc 'i',chr(29*4).q+'s +.++($_=q-m-),++$_;
print chr for 116,$_[0],97,$_[0],98;
print 'ug,',chr(), scalar reverse qq?!erutaef a s'ti?;
cbxk1xg
 2004-06-07 00:21
#2763 #2763
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
[quote=jemand,06.06.2004, 21:45](...) du musst doch ehh wissen welche sessionid die datei hat also schreib halt einfach id und endung in ne datei aus der dann des vom mailskript ausgelesen wird...[/quote]
Das funktioniert so nicht, da ich die SessionID schon mit einem anderen Script erzeuge, noch bevor ich überhaupt eine Datei hochlade. Ich will nun auch nicht für eine so einfache Aufgabe eine komplette Session Verwaltung coden, sondern mir reicht es absolut wenn ich den Dateinamen der gesuchten Datei habe.

Nur wie finde ich die Datei jetzt wieder?  - siehe oben -

Das mit dem @rray ist ja genau das, was ich machen wollte. Wie geht das am besten?\n\n

<!--EDIT|cbxk1xg|1086553534-->
renee
 2004-06-07 00:51
#2764 #2764
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du wirst ja nur Zahlen als Dateiname (ohne die Extension) haben, oder?? Dann mach einfach ein
Code: (dl )
1
2
3
4
5
6
opendir DIR, "$TEMP_DIR/" or &file_error("Unable to open directory. $!");
readdir DIR for 0 .. 1;
@files = grep -f "$TEMP_DIR/$_", readdir DIR;
closedir DIR;

@files = sort{$b cmp $a} @files;


Jetzt sollte die Datei mit der höchsten SessionID im Element 0 stehen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
cbxk1xg
 2004-06-07 01:22
#2765 #2765
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Die SessionID ist eine Zufallszahl. Es kann also auch gut sein, dass die Zahl kleiner ist. Ich muss irgendwie den String $SessionID mit der gesuchten Datei in @files vergleichen. Und als Ergbniss-String brauche ich unbedingt den Dateinamen mit der Extension.

Also im wesentlichen geht es nur darum, die Extension der Datei zu ermitteln. Den Namen habe ich ja schon. Und ob die Datei wirklich existiert kann ich ja auch noch anderweitig prüfen (-f -e, etc...)\n\n

<!--EDIT|cbxk1xg|1086557075-->
esskar
 2004-06-07 01:54
#2766 #2766
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
my $filename = "ich.bin.eine.datei.txt";

sub get_fileextension
{
my ($file) = @_;

return pop split(/\./, $file);
}

print get_fileextension($filename);


wenn MIME::Lite die Endung nicht kennt, wird sie als
application/octet-stream codiert was eigentlich immer richtig ist!
cbxk1xg
 2004-06-07 02:06
#2767 #2767
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
@esskar:
Das hatte ich ja schon mit folgendem Code vor
Code: (dl )
my $ext = (split /\./, $AttachentFile)[1];


Aber die spannende Frage ist, wie lese ich das Verzeichniss aus, filter die passende Datei raus (0815.IrgendeineExtension) und packe das Ergebniss in einen String, wenn der Name zu dem String namens $SessionID passt?

Das ist genau der Teil, den ich nicht verstehe, bzw. nicht hinbekomme.

Quote
wenn MIME::Lite die Endung nicht kennt, wird sie als application/octet-stream codiert was eigentlich immer richtig ist!

Das ist doch schon mal gut. also stimmt dieser Teil meines Codes so?
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
# Das sollte den Content-type selbständig bestimmen.
$MIME::Lite::AUTO_CONTENT_TYPE = 1;

# Attachment anängen, umbennen, Mail abschicken.
$msg->attach(
Type        =>'auto',
Path        =>"$MailAttachment",
Filename    =>"picture$ext",
Disposition =>'attachment'
);
\n\n

<!--EDIT|cbxk1xg|1086559856-->
coax
 2004-06-07 04:58
#2768 #2768
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
[quote=cbxk1xg,06.06.2004, 21:07]
Code (perl): (dl )
1
2
3
4
5
6
# Datei in @files suchen
        foreach $_ (@files)
        {
        $AttachentFile = (split /\./, $_)[0];
        grep /$AttachentFile/i, @files;
        }
[/quote]
das grep tut hier so gut wie garnichts, weil du nicht mit den Rueckgabewerten weiterarbeitest.

Vielleicht suchst du ja das..
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
my $SessionID = 2297;
my %hash;

my @files = qw(9524.pdf 8905.zip 5548.txt 146.txt 2297.doc
               814.htm 2069.zip 5358.zip 7800.rar);

foreach my $filename (@files) {
       my($base) = $filename =~ /(.+?)\..+?$/;
       $hash{$base} = $filename;
}

# printf("%s => %s\n", $_, $hash{$_}) for keys %hash;

print "$hash{$SessionID}\n";

# Ausgabe:
#2297.doc


Grusz Christian.
,,Das perlt aber heute wieder...'' -- Dittsche
cbxk1xg
 2004-06-07 05:27
#2769 #2769
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
[quote=coax,07.06.2004, 02:58]das grep tut hier so gut wie garnichts, weil du nicht mit den Rueckgabewerten weiterarbeitest.[/quote]
Das scheint mir in die richtige Richtung zu gehen. Dennoch noch ein mal:

Die spannende Frage ist, wie lese ich das Verzeichniss aus, filter die passende Datei raus (0815.IrgendeineExtension) und packe das Ergebniss in einen String, wenn der Name zu dem String namens $SessionID passt?

Das ist der Teil den ich nicht verstehe. Einen RegEx definieren um die Dateiendung aus einem String zu lesen, bekomme ich ja hin.
esskar
 2004-06-07 05:34
#2770 #2770
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
wie wäre es, wenn du deinen ansatz überdenkst;
wenn du nicht weißt, wie du an deine daten ran kommst, dann hast du dir beim daten ablegen nicht genug gedanken gemacht und solltest es noch mal an andere stelle probieren
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



View all threads created 2004-06-06 23:07.