Schrift
[thread]284[/thread]

Datei mit unbekannter Extension suchen...: ...und mit MIME:Lite verschicken (Seite 2)

Leser: 1


<< |< 1 2 >| >> 19 Einträge, 2 Seiten
renee
 2004-06-07 08:57
#2771 #2771
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Außerdem scheinst Du selbst nicht zu wissen, was Du willst. Einmal sagst Du Du weißt den Namen der Datei und willst nur die Extension:
Quote
Den Namen habe ich ja schon. Und ob die Datei wirklich existiert kann ich ja auch noch anderweitig prüfen (-f -e, etc...)

und an anderer Stelle sagst Du, Du brauchst den Dateinamen, und du würdest schon wissen, wie man ne RegEx macht, mit der man die Extension bekommt.

Du solltest Dir also nochmal genauer Gedanken machen, was Du schon weißt / hast, und was Du jetzt noch brauchst...
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/
coax
 2004-06-07 15:29
#2772 #2772
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
@cbxk1xg,

was ist nun mit den Code von mir, tut er nicht das was er soll ? Immerhin erraet er doch richtig anhand der SessionID welche Datei es sein kann.

Du solltest dir da aber in der Tat was besseres einfallen lassen.
,,Das perlt aber heute wieder...'' -- Dittsche
cbxk1xg
 2004-06-07 15:42
#2773 #2773
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
OK, ich sehe ein, dass es nicht produktiv ist, wenn man um 03:27 Uhr versucht ein programmiertechnisches Problem zu lösen. Darum versuche ich mein Problem noch mal genauer zu beschreiben.

Ich habe zwei Skripte, ein MailFormularscript und ein Uploadscript. Das Mailformularscript generiert beim ersten Aufruf eine SessionID und nimmt Daten wie etwa Name, Adresse, etc. entgegen. Beim vorletzten Schritt, also nach Validierung, gibt dieses Mailfomular dann noch einen Link aus, der etwa so aussieht: http://foo.bar/cgi-bin/Upload.pl?45678672752

Klick man nun auf diesen Link, kommt man zum Uploadscript. Das was nun im Querystring steht, nimmt das Uploadformular als künftigen Dateinamen und fügt dann noch die Extension der Datei dazu, die hochgeladen wird. Also z.B. 45678672752.jpg

Nun soll das Uploadfenster wieder geschlossen werden (hoffen wir mal, das die User das auch tun). Gegen doppelte Uploads ist das Uploadscript jedenfalls gesichert...

Klickt man nun auf submit im Mailformularscript, soll das Script die Daten wie Name, Adresse nehmen und eine E-Mail absenden an die nun "nur" noch das Attachment angehangen werden soll.

Nun kommt der Teil, der mir Probleme bereitet:
Ich kenne den Pfad und den Dateinamen und kann theoretisch einen Bezug zwischen den anderen Benutzerdaten und der Datei herstellen. Leider bin ich dazu anscheinend zu blöd. Ach ja, und ich kenne nicht die Extension der Datei, da ich diese nicht so ohne weiteres in die SessionID schreiben und wieder zurück an mein Mailformular geben kann.

Daher war meine Idee, ich lese den Ordner aus und speichere alle gefundenen Dateinamen in dem Array @files. Dann suche ich in dem Array nach einem Dateinamen der auf meine SessionID passt und schreibe diesen Dateinamen INKLUSIVE der Extension in einen Strings namens $AttachentFile.

Und genau das bekomme ich nicht hin. Und ich denke das liegt nicht daran, dass der gedankliche Ansatz so schlecht ist, sondern ich bin einfach kein besonders erfahrener Perlprogrammierer.

Ich hoffe ich habe mich jetzt verständlicher ausgedrückt.
cbxk1xg
 2004-06-07 15:51
#2774 #2774
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
[quote=coax,07.06.2004, 13:29]was ist nun mit den Code von mir, tut er nicht das was er soll ? Immerhin erraet er doch richtig anhand der SessionID welche Datei es sein kann.[/quote]
Irgendwie verstehe ich nicht, wie das genau funktioniert. Wo ist den der Bezug zur SessionID? Müsste man nicht vergleichen, ob die SessionID mit einem Dateinamen matcht?

Ich habe mal versucht deinen Vorschlag einzubauen und die Eegbnisse testweise auszugeben. Bei mir gibt das jedenfalls einen Error 500.
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
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;

my %hash;

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

my $AttachentFile = $hash{$SessionID};
my $ext = (split /\./, $AttachentFile)[1];
my $MailAttachment = "$TEMP_DIR/$SessionID$ext";

if (!-e $MailAttachment) {&program_error("Keine Datei vorhanden. $!");}

print "Content-type: text/html\n\n";
print "AttachentFile: $AttachentFile<br>\n";
print "MailAttachment: $MailAttachment<br>\n";
print "ext: $ext<br>\n";
exit;
coax
 2004-06-07 16:28
#2775 #2775
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
[quote=cbxk1xg,07.06.2004, 13:51]Irgendwie verstehe ich nicht, wie das genau funktioniert. Wo ist den der Bezug zur SessionID? Müsste man nicht vergleichen, ob die SessionID mit einem Dateinamen matcht?[/quote]
Du hast dir den Code nicht genau angesehen.

Code: (dl )
1
2
3
4
foreach my $filename (@files) {                # $filename = '45646.txt';
     my($base) = $filename =~ /(.+?)\..+?$/;   # $base = 45646;
     $hash{$base} = $filename;                 # $hash{'45646'} = '45646.txt';
}


Hier wird nichts weiter gemacht auszer, dass:
Fuer jeden Dateinamen der Teil vor der Dateierweiterung in $base gesichert wird.
$base dann als Schluessel fuer den Hash %hash dient und als Wert den originale Dateiname (mit Extension) zugewiesen bekomment.
So dass, $hash{$SessionID} dann auf den vollstaendigen Dateinamen passend zur SessionID zeigt.
Ich hab mal neben meinen Code als Kommentar, die eventuellen Werte der Variablen angegeben damit sich das leichter nachvollziehen laesst wie's funktioniert.


In deinen Code koennte das dann so aussehen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
my %hash;

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

my $MailAttachment = "$TEMP_DIR/" . $hash{$SessionID};

if (!-e $MailAttachment) {&program_error("Keine Datei vorhanden. $!");}


Quote
Ich habe mal versucht deinen Vorschlag einzubauen und die Eegbnisse testweise auszugeben. Bei mir gibt das jedenfalls einen Error 500.

Logfiles-Lesen gibt da mehr Aufschluss ;)
,,Das perlt aber heute wieder...'' -- Dittsche
cbxk1xg
 2004-06-07 16:56
#2776 #2776
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
[quote=coax,07.06.2004, 14:28]In deinen Code koennte das dann so aussehen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
my %hash;

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

my $MailAttachment = "$TEMP_DIR/" . $hash{$SessionID};

if (!-e $MailAttachment) {&program_error("Keine Datei vorhanden. $!");}
[/quote]
Ich werd bekloppt, genau das war die Lösung. Jetzt verstehe ich auch den Teil mit $hash{$SessionID};. Das mit dem Error 500 hat sich nun auch auf wundersame Weise gelöst.

Vielen Dank an alle!!!

Für die, die es interessiert, hier die Lösung im Ganzen:
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
48
49
50
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;


my %hash;

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

my $MailAttachment = "$TEMP_DIR/" . $hash{$SessionID};
my $ext = (split /\./, $MailAttachment)[-1];
my $picturename = "bild";

if (!-e $MailAttachment) {&program_error("Keine Datei vorhanden. $!");}

use MIME::Lite;

# Create a new multipart message:
$msg = MIME::Lite->new( 
        From    =>"$CompanyName <$CompanyEmail>",
        To      =>"$CompanyName <$CompanyEmail>",
        Cc      =>'',
        Subject =>"Nachricht von $company",
        Type    =>'multipart/mixed'
        );

# Add parts (each "attach" has same arguments as "new"):
$msg->attach(Type => 'text/html',
Data => qq
{
bla, bla
}
);


# Add the attachment and automaticly determine the content type:
$MIME::Lite::AUTO_CONTENT_TYPE = 1;
$msg->attach(
        Type        =>'auto',
        Path        =>"$MailAttachment",
        Filename    =>"$picturename.$ext",
        Disposition =>'attachment'
        );

$msg->send;


Ich bin mir zwar immer noch nicht sicher ob der Teil:
Code: (dl )
1
2
3
$MIME::Lite::AUTO_CONTENT_TYPE = 1;
$msg->attach(
Type =>'auto',

so 100%ig stimmt, aber auch mit PDFs und JPEGs scheint es da nach meinem Test, kein Problem zu geben.

Noch mals, vielen Dank!
Dubu
 2004-06-08 02:31
#2777 #2777
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Warum eigentlich nicht
Code: (dl )
my $filename = glob ("$TEMP_DIR/$SessionID.*");

?
cbxk1xg
 2004-06-08 03:42
#2778 #2778
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
[quote=Dubu,08.06.2004, 00:31]Warum eigentlich nicht
Code: (dl )
my $filename = glob ("$TEMP_DIR/$SessionID.*");

?[/quote]
Gute Frage. Aber wie heißt es schon in meiner Sigantur:
Code (perl): (dl )
if ($FunktionertAllesSoWieEsSoll eq 'ja') {print "Laß es so!";}


Und wäre ich jetzt ein amerikanischer Rapper würde ich noch hinzufügen: WORD!
Dubu
 2004-06-11 15:13
#2779 #2779
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Da halte ich dann mit "KISS - Keep It Small and Simple" dagegen. ;)
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



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