Avatar billede nemlig Professor
15. november 2008 - 23:33 Der er 11 kommentarer og
1 løsning

Omdøb filnavn, inden den vedhæftes email

Hej.
Jeg er ved at lave et email-script, hvor man bl.a. kan vedhæfte en fil.
Filnavn og -type gemmer jeg i MySQL, men gemmer filen i en mappe. Filen omdøbes samtidig til tabelpostens ID nr. og hedder fx. "23.xxx".
Når jeg så skal sende emailen, vil jeg gerne have den døbt tilbage til det oprindelig navn og type, så filen vises korrekt hos modtageren.

Den simple kode uden omdøbning ser sådan her ud:

$fileatt = "filer/23.xxx"; //henter filen
$mail->AddAttachment($fileatt); //vedhæfterfilen

Det oprindelig navn hedder fx. "invitation.doc"
Hvordan hulen får jeg det rettet?
Avatar billede nemlig Professor
15. november 2008 - 23:47 #1
Jeg kan selvfølgelig anvende PHP's rename funktion inden jeg henter filen med
rename ("23.xxx","invitation.doc");

og når dokumentet er vedhæftet, kan jeg rename tilbage igen.

Men kan det gøres smartere?
Avatar billede Slettet bruger
16. november 2008 - 03:20 #2
Er ikke helt sikker på den måde du har sat det op, men jeg ville gøre det på denne måde:

-- Database Tabellen --
CREATE TABLE IF NOT EXISTS `email_attachments`(
`id` INT NOT NULL AUTO_INCREMENT, -- Attachment ID
`name` TEXT NOT NULL -- Filens oprindelige navn
);


-- PHP Koden --
// Indsætter filen i databasen
mysql_query("INSERT INTO `email_attachments`(`name`) VALUES('".$_FILES["fil"]["name"]."')");

// Henter filens ID
$the_id = mysql_insert_id();

// Henter filens extention type (ex. ".jpg")
$seperate = explode(".",$_FILES["fil"]["name"]);
$the_ext = $seperate[count($seperate) - 1];

// Angiver upload_dir
$upload_dir = "email/attachments/"
$the_file = $the_id.".".$the_ext;

// Sammensætter sti ud fra upload dir og file
$new_file = $upload_dir . $the_file;

// Upload filen
if(move_uploaded_file($_FILES["fil"]["tmp_name"],$new_file)) {
  // Filen er blevet uploadet
} else {
  // Filen blev ikke uploadet, så vi sletter filen fra databasen igen
  mysql_query("DELETE FROM `email_attachments` WHERE `id` = ".$the_id."");
}



Så når du sender mailen skal du hente filens oprindelige navn fra databasen, som gøres ved at finde rækken hvor "id" matcher til filens navn, uden fil-typen.


Håber det var en hjælp :o)
Avatar billede Slettet bruger
16. november 2008 - 10:49 #3
Faldt lige over et eksempel system jeg havde lavet tidligere, det har dog intet med mails at gøre.
Men selve systemet er man uploader en fil, den gemmer det under et nyt navn, og når man så vil hente filen ned igen så finder den det oprindelige navn og smider i hovedet på klienten.

Linket til systemet er: http://krelle.dk/fil.php

Du kan jo prøve lige se det hurtigt igennem og tjekke om det er noget i den dur du vil have.
Avatar billede nemlig Professor
16. november 2008 - 13:20 #4
Hej roxki og tak for dine bidrag.
Det du beskriver har jeg lavet i forvejen.
Det vil sige, at filen er gemt i en mappe på serveren, men under et andet navn, fx. "23.xxx". (23 er id-nummeret fra tabellen.).
Og i tabellen har jeg gemt oplysninger om filens oprindelige navn, som fx. er "invitation.doc".

Udfordringen er når jeg skal vedhæfte filen til en email. Her anvender jeg PHPmailer-scriptet.
Så henter jeg filen på serveren (filnavn = 23.xxx) og vedhæfter den emailen med:
$mail->AddAttachment($fileatt);
Men jeg mangler at navngive den vedhæftede fil med "invitation.doc". Jeg kan godt finde ud af at hente navneoplysningerne fra MySQL, men hvordan jeg omdøber den fra 123.xxx til invitation.doc kan jeg ikke finde ud af.
Jo jeg kan rename den på serveren inden jeg vedhæfter den.
Og det har jeg også til at virke.
Avatar billede locke Nybegynder
16. november 2008 - 13:26 #5
http://phpmailer.codeworxtech.com/index.php?pg=methods

AddAttachment($path, $name = "", $encoding = "base64",
    $type = "application/octet-stream")

så jeg ville fluks prøve med:

$mail->AddAttachment($fileatt, "filnavn");
Avatar billede nemlig Professor
16. november 2008 - 13:48 #6
Det var knagme et rigtigt godt bud.
Det var løsningen - mange tak for det.
Send venligst et svar.
Avatar billede Slettet bruger
16. november 2008 - 13:52 #7
Hehe vidste du ikke var så langt, men glad for du fik til at virke :o)
Avatar billede nemlig Professor
16. november 2008 - 14:25 #8
Roxki - dit bidrag er nu ikke helt forgæves. Kan du ikke lige vise mig hvordan du omdøber filen, når man downloader den fra arkivet. Det er nemlig det næste, jeg skal til. Så sparer jeg lidt tid der.
Og så forhøjer jeg bare pointene.
Avatar billede Slettet bruger
16. november 2008 - 14:45 #9
Det er ikke helt det samme når det går igennem en mail server.
Det jeg gør er jeg gemmer filens navn og type (image/jpeg som eksempel)
Når man så vil downloade filen sender jeg klienten vidre til en side der henter dataen ud fra databasen med følgende headers:

Headers("Content-Type: $filens_mime_type");

så hvis jeg har filens type "image/jpeg" i databasen vil min header se sådan her ud:

Headers("Content-Type: image/jpeg");

For at få browseren til automatisk at starte downloade bruger jeg headeren "Content-Disposition" med attachment. Gøres sådan her:

Headers("Content-Disposition: attachement; filename=$filens_navn");

så min header kunne være:

Headers("Content-Disposition: attachment; filename=mig_closeup.jpg");

og så mangler man til sidst at udskrive selve dataen til klienten, så der er noget at downloade. Gøres ved brug af READFILE()

readfile($filens_placering);

så min download funktioner ser samlet sådan her ud:

Headers("Content-Type: image/jpeg");
Headers("Content-Disposition: attachment; filename=mit_closeup.jpg");
readfile("images/1.jpg"); /* 1.jpg da jeg lagrer filerne efter ID nummeret i databasen */

Håber du kan bruge nogle af delene, må dog sige jeg ikke helt er med på hvordan det skal kobles sammen med dit mail system, hehe..
Til det ville jeg nok lave en kopi af den uploadede fil og sende den med, når mailen så er sendt, ville jeg slette den kopierede fil, så du ikke får dobbelt filer.
Avatar billede Slettet bruger
16. november 2008 - 14:53 #10
Det skal lige noteres at headers skal sendes inden noget andet på siden, bare lige så du er opmærksom på det.
Avatar billede nemlig Professor
16. november 2008 - 15:12 #11
Ok - tak for informationerne.
Email-systemet er 2 ting:
1. Indtast og send email
2. Arkiv over sendte emails. Det er her, at man skal kunne hente og vise vedhæftede dokumenter.
Send venligst et svar.
Avatar billede Slettet bruger
16. november 2008 - 15:19 #12
Okay hvis du henviser i dine sendte e-mails til dit arkiv, er det intet problem.
Så er det bare at henvise til en download side.. et eksempel kunne være:

E-mail fil attachement link:
<a href="http://dit-domaine.dk/mails/attachment.php?id=XX">XX</a>


Din "attachment.php" fil, eller hvad du nu bruger:

<?php
// Henter ID fra HTTP GET Vars
$id = $_GET["id"];

// Henter filen fra databasen
$tjek = mysql_query("SELECT * FROM `email_attachments` WHERE `id` = ".$id."");

// Henter dataen ud fra databasen
$data = mysql_fetch_array($tjek);

// Angiver lokation på den oprindelige fil
$fil_dir = "images/email";

  // Henter fil extention
  $exp = explode(".", $data["navn"]);
  $ext = $exp[count($exp) - 1];

$filen = $fil_dir . "/" . $id . "." . $ext;

// Laver Headers
Headers("Content-Type: ".$data["type"]);
Headers("Content-Disposition: attachment; filename=".$filen);
readfile($filen);
?>

Held og lykke med 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