martenk
Goto Top

Email before download

hallo Gemeinschaft,


ich habe 10 Exposes auf meinem Server liegen

nu soll der Prozess so sein, dass wenn man sich auf einem der Objekte befindet, dass dort ein Affenformular ist - wenn man sich dort einträgt, dann soll ein db Eintrag erfolgen und es soll eine Email versendet werden, mit dem Exposes auf der Seite, von der man das Formular abgesendet hat


wie würdet ihr sowas aufbauen -

Content-Key: 467989

Url: https://administrator.de/contentid/467989

Printed on: April 19, 2024 at 15:04 o'clock

Member: maretz
maretz Jul 01, 2019 at 14:57:47 (UTC)
Goto Top
Moin,

erst mal würde ich überlegen wie ich die Frage stellen würde BEVOR ich die stelle... Aber ich würde mir nen einfaches PHP-Formular bauen und dann halt nen Link zu den Dokumenten rausschicken...

Lg,

Mike
Member: falscher-sperrstatus
falscher-sperrstatus Jul 01, 2019 updated at 14:58:38 (UTC)
Goto Top
Hallo Marten,

simples 1x1 der PHP Formverarbeitung, on succesful Submit, abschicken.

VG
Member: Lochkartenstanzer
Lochkartenstanzer Jul 01, 2019 updated at 15:02:27 (UTC)
Goto Top
Zitat von @martenk:

hallo Gemeinschaft,

Moin,

.. dass dort ein Affenformular ist -

Schimpanse, Gorilla, Orang-Utan oder Makkake?

lks
Member: martenk
martenk Jul 01, 2019 updated at 15:11:02 (UTC)
Goto Top
Lieben Dank - also okay - ich lasse die Dokumente auf meinem Webspace in einem Ordner und versende nur den Link. - in diesen Ordner - wie würdet ihr es machen, wenn ich die Objektpdf versenden möchte - könnte man diesen Ordner gegen normalen zufälligen download sichern
Member: colinardo
colinardo Jul 01, 2019 updated at 15:23:17 (UTC)
Goto Top
- könnte man diesen Ordner gegen normalen zufälligen download sichern
GUID oder andere zufällige lange ID erzeugen, diese ID zusammen mit dem Dateinamen auf dem Webserver in der Datenbank hinterlegen. Dann beim Download als URL-Parameter die ID mitgeben und damit dann das File aus der Datenbank ermitteln und per read an den Client zurückschicken.
ID dann z.B. mit Gültigkeitstoken versehen (Ablaufdatum) und per regelmäßigen Cron oder Databasetrigger aus der DB löschen.

Alternativ nur per Authentifizierter Session-ID den Download freigeben wenn man mit expliziten Logins arbeitet.

Grüße Uwe
Member: StefanKittel
StefanKittel Jul 01, 2019 at 19:51:39 (UTC)
Goto Top
Hallo,

mit dem Abschicken des Formulars erstellst Du ein Token.
Einfach einen zufälligen Wert.

In der Mail ist auch kein Link auf das Dokument sondern https://firma.de/download.php?token=6xRscr2WcA8u9nKbUPBtTe4TYxjFsm2D
Das 2. Skript liest aus der DB aus welches Dokument es sein soll, löscht den DB Eintrag und gibt das Dokument als download aus.

Stefan
Member: martenk
martenk Jul 02, 2019 updated at 07:54:07 (UTC)
Goto Top
Hi Stefan,

verstehe es noch nicht ganz.

Beim absenden des Formulares erstelle ich einen Token - okay Zufallswert, welche ich in die Tabelle ablege - vermutlich mit den Objektdaten

also z.b.

id_objekt__token
1_E4______1243252543

und wie dann weiter
Member: StefanKittel
StefanKittel Jul 02, 2019 updated at 07:59:28 (UTC)
Goto Top
Moin,

sagen wir mal E4 ist der Dateiname.

ungefährt so

$data = FileGetContents($Dateiname);
header("Content-type:application/pdf");
echo data;

siehe auch
https://stackoverflow.com/questions/20080341/correct-php-headers-for-pdf ...
Member: colinardo
colinardo Jul 02, 2019 updated at 08:01:33 (UTC)
Goto Top
Zitat von @martenk:
id_objekt__token
1_E4______1243252543

und wie dann weiter
Du schickst dem User einen Link ala
https://mydomain.com/download.php?token=1243252543
Im Script Download.php holst du dir per Select den Eintrag mit dem Token (welchen du mit $_GET['token'] aus der URL holst) aus der DB, und gibst das entsprechende Exposé per gesetzten Attachment-Header und readfile an den User aus.
https://www.php.net/manual/de/function.readfile.php
<?php
$file = 'monkey.gif';  

if (file_exists($file)) {
    header('Content-Description: File Transfer');  
    header('Content-Type: application/octet-stream');  
    header('Content-Disposition: attachment; filename="'.basename($file).'"');  
    header('Expires: 0');  
    header('Cache-Control: must-revalidate');  
    header('Pragma: public');  
    header('Content-Length: ' . filesize($file));  
    readfile($file);
    exit;
}
?>
Member: martenk
martenk Jul 02, 2019 at 12:23:32 (UTC)
Goto Top
Schade, dass ist irgendwie zu hoch für mich - lieben Dank für eure Hilfe - ich bekomme es nicht hin - was klappt ist, dass ich den Datensatz in der Tabelle download hinbekomme - also mit dem Formular trage ich die Daten in die Tabelle ein

id_email_anrede_name_objekt_token

- doch dann muss ja noch die Email an den Kunden versendet werden und dann mit dem Auswählen der E4.pdf
Member: colinardo
colinardo Jul 02, 2019 updated at 13:25:42 (UTC)
Goto Top
Zitat von @martenk:
- doch dann muss ja noch die Email an den Kunden versendet werden
Hiermit schnell erledigt https://www.php.net/manual/de/function.mail.php
Sieh dir die Beispiel in den Kommentaren an dann schafft das auch ein Anfänger in Nullkommanix.
und dann mit dem Auswählen der E4.pdf
Einfache Select-Abfrage auf deine Datenbank
SELECT * FROM TABELLE_TOKENS WHERE TOKEN='XYZ'
https://php.net/manual/de/mysqli.query.php

Wenn das Ergebnis der Abfrage eine Zeile aus der Datenbank liefert gibt es einen Eintrag, im Erfolgsfall (also wenn es einen Eintrag gibt) nimmst du dann aus der zurückgegebenen Zeile den String aus der Spalte in der du dein Expose hinterlegt hast. Entweder ist der String direkt ein Dateiname zu einem File das auf dem Webserver liegt, oder nur ein Fremdschlüssel einer weiteren Tabelle in der die Zuordnung zu einem Dateinamen steht.
Im ersteren Fall kombinierst du den Dateinamen aus der zurückgelieferten Zeile und kombinierst den mit einem lokalen Pfad auf deinem Webserver. Den Pfad übergibst du dann um beim obigen Beispiel zu bleiben an die Variable $file und machst dann weiter wie im obigen Beispiel-Skript.
Anschließen noch zu gegebenem Zeitpunkt ein DELETE FROM TABELLE_TOKENS WHERE TOKEN='XYZ' auf die Tabelle zum Löschen des Tokens, fertig.

Wie man solche Downloadskripte strickt steht übrigens schon x-fach im Web:
https://www.google.com/search?q=PHP+download+scripts

Dir hier PHP Grundlagen beizubringen wäre in einem Admin-Forum doch etwas übertrieben, die musst du dir schon Schritt für Schritt selbst erarbeiten, ansonsten ab zum Dienstleister.

Viel Erfolg
Grüße Uwe
Member: NordicMike
NordicMike Jul 02, 2019 at 22:50:58 (UTC)
Goto Top
Wenn Su selbst nicht programmieren kannst, kannst Du auch was fertiges nehmen. Google einfach nach:
Webshop für Downloads

Den Preis kannst Du ja auf 0€ setzen. Für den Download muss sich der Interessent registrieren.

Man kann sich sowas auch per Joomla selbst zusammen stricken. Joomla kann Formulare erstellen, dessen ausgefüllte Daten in die Datenbank geschrieben werden, und danach auf eine Seite leiten, auf dem ein Link zum Download zu sehen ist.
Member: martenk
martenk Jul 05, 2019 updated at 07:46:37 (UTC)
Goto Top
Hallo Uwe - du kannst mir da nicht sowas zusammenbasteln - an der Stelle mit db übergabe des token und Zusammenstellen des links

Lieben Gruss
Marten
Member: colinardo
colinardo Jul 05, 2019 updated at 08:08:23 (UTC)
Goto Top
Umesöns und das auch noch am Strand, vergiss es, für den Anfängerkrams bin ich ehrlich gesagt zu ausgebucht face-smile.
Nutze die Zeit lieber um dir die Materie gründlich anzulesen, das bringt dich effektiv weiter als in Foren zu betteln.
Member: maretz
maretz Jul 05, 2019 at 09:16:36 (UTC)
Goto Top
Weiter oben hat doch jemand sogar schon ne art Webshop dafür genannt...

Ganz ehrlich: "mal eben zusammenbauen" - viel erfolg damit... Das kannst du machen wenn du es für deinen EIGENEN Laden machst. Jeder andere würde entweder schon mal wg. Schwarzarbeit nen Problem bekommen und/oder eben auch nen gewissen Support übernehmen müssen. Was ist wenn das Script in der nächsten PHP-Version nicht mehr läuft? Wenn deine Datenbank geknackt wird? Und was machst du wenn jemand dann deine Kundendaten einfach auch noch kurz rauszieht? (Du kennst ja hier vermutlich keinen von denen die schreiben - weisst du ob ICH nich zufällig schon ein ähnliches Gewerbe wie du betreibe und mich freuen würde wenn ich so einfach an deine Daten komme?)

Von daher würde ich das generell nich so ausm Forum nehmen. Frage ansonsten die nächste Software-Firma, die sollten sowas in weniger als 1 Tag bauen, d.h. es sollte auch preislich nich gleich jeden Rahmen sprengen. Nur das du dann Support hast UND jemand der auch die Haftung/Wartung/whatever übernehmen kann...
Member: martenk
martenk Jul 08, 2019 at 10:58:02 (UTC)
Goto Top
hallo uwe - hab doch noch eine frage bzgl des downloadfiles

ich lege doch fest auf meinem webspace, wo die z.b. mk1.pdf liegt - z.b. im ordner expose

ich verstehe nicht, wie du es meinst, bei zusammenstellen des downloadlinks, wie ich dann auf die ordneradresse komme
Member: colinardo
colinardo Jul 08, 2019 updated at 12:21:19 (UTC)
Goto Top
$filepath = "/ordner/zu/den/pdfs/" . $filename;  
https://www.php.net/manual/de/language.operators.string.php
Member: martenk
martenk Jul 10, 2019 at 13:31:52 (UTC)
Goto Top
verstehe ich leider nicht - ich lege doch in der Datenbank Tabelle die Kundendaten ab und dazu noch ein Objekt, für das sich der Kunde interessiert und das expose, was er auch erhalten soll - nun bekommt der Kunde ja eine Mail, mit dem Link, der in der Art verschlüsselt sein soll, dass man nicht das downloadverzeichnis sieht
Member: colinardo
colinardo Jul 10, 2019 updated at 13:50:36 (UTC)
Goto Top
Zitat von @martenk:

verstehe ich leider nicht - ich lege doch in der Datenbank Tabelle die Kundendaten ab und dazu noch ein Objekt, für das sich der Kunde interessiert und das expose, was er auch erhalten soll - nun bekommt der Kunde ja eine Mail, mit dem Link, der in der Art verschlüsselt sein soll, dass man nicht das downloadverzeichnis sieht
Och mönsch du bist aber wirklich etwas schwer von Begriff. $filename ermittelst du natürlich über eine Datenbankabfrage in der Tabelle wo Token und Expose-Name jeweils in separaten Spalten hinterlegt sind!! Les dir oben nochmal alles genau durch und vor allem die Links die man dir gepostet hat.
Ich bin jetzt raus. Mach vielleicht erst mal einen Grundkurs PHP und wenn du damit fertig bist kommst du bei spezifischen Problemen wieder.
Gegen Aufwandsentschädigung gerne jederzeit auch via PN.

Viel Erfolg.
G. @colinardo
Member: martenk
martenk Jul 10, 2019 at 13:53:31 (UTC)
Goto Top
das mit der Programmierung ist eine Sache - was viel problematischer ist, ich weiss nicht, was ich dem Kunden senden soll als LINK - wie man eine Zeichenkette erstellt weiss ich -
Member: maretz
maretz Jul 10, 2019 at 14:02:51 (UTC)
Goto Top
ganz ehrlich: für die zeit die du jetzt verwendet hast um das selbst zu bauen (erfolglos) hättest du vermutlich auch ne firma fragen können die dir das schnell zusammenbrät... Das sollte idR. keine 2h (inkl. Test) brauchen... Oder ist die Hoffnung das hier irgendwann jemand sagt "komm her, ich bau das schnell und schick dir das fertige umsonst einfach zu" bzw. es direkt bei dir zusammenbaut?
Member: martenk
martenk Jul 10, 2019 updated at 14:09:21 (UTC)
Goto Top
nein - ich möchte es ja auch umsetzen können - bloss nach wie vor muss ich das Prinzip verstanden haben - was ich bisher habe ist, dass ich per Formular die Kundendaten das Objekt und ein Token ablege - und dann ... jetzt geht doch der link zum Kunden - link=domain+token
Member: colinardo
colinardo Jul 10, 2019 updated at 14:22:37 (UTC)
Goto Top
Zitat von @martenk:

ich weiss nicht, was ich dem Kunden senden soll als LINK - wie man eine Zeichenkette erstellt weiss ich -
Na den Link zu deinem Downloadskript inkl. deinem generierten Token also GET Parameter.
Genau das habe ich oben ganz zu Anfang schon im Kommentar von 02.07 erläutert
Email before download

Das zum Thema genau "lesen" ...
Member: martenk
martenk Jul 10, 2019 at 14:36:13 (UTC)
Goto Top
was würdest du nehmen um einen eindeutigen token zu erstellen
Member: StefanKittel
StefanKittel Jul 10, 2019 at 15:24:37 (UTC)
Goto Top
Zitat von @martenk:
was würdest du nehmen um einen eindeutigen token zu erstellen
Einen Hash-Wert einer "Zufallszahl" (z.B. Uhrzeit, Datum, IP des Clients, Dateiname, etc).
Member: colinardo
colinardo Jul 10, 2019 updated at 16:11:28 (UTC)
Goto Top
Oder ne UUID, bsp.:
function UUID() {
	return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',  
		mt_rand(0, 0xffff), mt_rand(0, 0xffff),
		mt_rand(0, 0xffff),
		mt_rand(0, 0x0fff) | 0x4000,
		mt_rand(0, 0x3fff) | 0x8000,
		mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
	);
}
Nur immer dran denken wenn du URL-Sonderzeichen nutzt bitte beim Generieren die URL encodieren, für solche Spirenzchen reichen aber eine ausreichend lange Zahlen und Buchstabenkombination vollkommen aus.
Member: martenk
martenk Jul 11, 2019 updated at 07:06:13 (UTC)
Goto Top
Mist - klappt nicht
habe im Ordner script einen Ordner downlaod angelegt - dort liegt die Datei N8.png

die query gibt den richtigen Wert "N8" zurück und auch download_path ist richtig, wenn ich diesen pfad nehme und ins adressfeld kopiere, dann wird das bild angezeigt -
$name = "a94bcfd7a471435179184f44048b95d1";  
$con = new MySQLi("1111.hosting-data.io", "11", "111#", "11");  
if ($con->connect_error) {
echo "Fehler bei der Verbindung: " . mysqli_connect_error();  
exit();
}
$query = "SELECT * FROM expose WHERE token = '$name'";  
$data=mysqli_query($con,$query);
while($row=mysqli_fetch_array($data)){
    echo $row['objekt'];  
	      $download_path = "http://meine domain.de/script/download/".$row['objekt'].".png";  
      $file_to_download = $download_path; // file to be downloaded
      header("Expires: 0");  
      header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");  
      header("Cache-Control: no-store, no-cache, must-revalidate");  
      header("Cache-Control: post-check=0, pre-check=0", false);  
      header("Pragma: no-cache");  header("Content-type: application/file");  
      header('Content-length: '.filesize($file_to_download));  
      header('Content-disposition: attachment; filename='.basename($file_to_download));  
      readfile($file_to_download);
      
	
	
	echo "VARIABLE".$download_path;  
	echo "TEST";  
	exit;
	
	

	
   }
Member: colinardo
colinardo Jul 11, 2019 updated at 08:23:01 (UTC)
Goto Top
$download_path = "http://meine domain.de/script/download/".$row['objekt'].".png";
Ist ja auch Blödsinn einen HTTP Pfad an readfile zu übergeben. Du willst ja gerade den direkten Download über einen direkt erreichbaren Pfad verhindern.
Deswegen packt man die Files in einen Ordner der über den Browser erst gar nicht erreichbar ist oder dessen direkten Zugriff man per htaccess oder config sperrt, denn readfile liest das File aus den lokalen Verzeichnissen des Webservers aus und schickt es byteweise direkt an den Client, deswegen ist keine direkte externe URL nötig.

$download_path = "lokaler/Pfad/auf/dem/webserver/".$row['objekt'].".png";  
Außerdem fehlt natürlich jede Menge Validierungsarbeit der übergebenen Parameter und der Existenz von Dateien!
Member: martenk
martenk Jul 11, 2019 at 08:22:50 (UTC)
Goto Top
wie sollte ich es denn dann machen deiner meinung nach
Member: colinardo
colinardo Jul 11, 2019 at 08:23:10 (UTC)
Goto Top
Steht oben.
Member: martenk
martenk Jul 11, 2019 updated at 08:27:14 (UTC)
Goto Top
ich verstehe es dann wohl nicht - ich lege in meine tabelle die datei und den pfad ab - jetzt sende ich den link mit dem token an die mailadresse - wenn man den link ausführt, dann kommt man zu der php datei, wo ich den token auslese und mir duch die DB Abfrage die Datei hole - doch wie dann weiter - wie komme ich denn dann zum download der Datei
Member: colinardo
colinardo Jul 11, 2019 updated at 08:46:44 (UTC)
Goto Top
Ich hab's dir doch im letzten Post und schon 100 mal geschrieben, lege das File in einen lokalen Pfad auf dem Webserver der nicht durch eine URL erreichbar ist, aber auf welchen der PHP Dämon Lese-berechtigt ist! Readfile braucht keine URL es reicht ein lokaler Dateipfad, es liefert die Bytes der Datei direkt an den Browser aus und die URL mit dem Token ist schon die fertige URL für den Client, ruft er diese auf und es gibt den Token wird bei ihm direkt der Download gestartet. Wichtig ist ebenfalls das man bevor man die Header schreibt nichts anderes (auch kein Echo) ausgibt!
Les doch bitte eingehend die Doku zu Readfile, DANKE.
https://www.php.net/manual/de/function.readfile.php

Ciao.
Member: martenk
martenk Jul 11, 2019 updated at 08:57:50 (UTC)
Goto Top
Ich habe einen Ordner FH - auf diesen verweist meine domain - muss der ordner noch eine Ebene höher sein?

ich habe jetzt einen ordner "download" über FH angelegt und dort N8.png reinkopiert - der download startet nicht

kopiere ich es in gleichen Ordner rein, dann passiert was - prob ist dann nur, wenn ich ein pdf dort ablege, dann erscheinen lauter hieroglyphen

	      $download_path = "N8.pdf";  

      $file_to_download = $download_path; // file to be downloaded
      header("Expires: 0");  
      header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");  
      header("Cache-Control: no-store, no-cache, must-revalidate");  
      header("Cache-Control: post-check=0, pre-check=0", false);  
      header("Pragma: no-cache");  header("Content-type: application/file");  
      header('Content-length: '.filesize($file_to_download));  
      header('Content-disposition: attachment; filename='.basename($file_to_download));  
      readfile($file_to_download);
Member: colinardo
colinardo Jul 11, 2019 updated at 09:06:57 (UTC)
Goto Top
dann erscheinen lauter hieroglyphen
Weil man, bevor man die Header ausgibt, nichts aber rein gar nichts an den Client senden darf, auch kein echo was du ja oben machst. Ist ja auch logisch denn hat man vorher schon was wann den Client gesendet sind die Header schon gesetzt und lassen sich dann nicht mehr ändern und du siehst die Binarys des PDFs als Klartext!
Member: martenk
martenk Jul 11, 2019 at 09:06:54 (UTC)
Goto Top
klasse, dass wars - gibt es vielleicht eine Möglichkeit, dass das PDF im Browser angezeigt wird?
Member: colinardo
colinardo Jul 11, 2019 updated at 09:10:25 (UTC)
Goto Top
Das entscheidet letztendlich die Clientseite.
Mit dem Content Disposition "Inline" statt Attachment kann man Browser dazu anweisen, aber letztendlich entscheidet der Browser mit seinen Plugins wie er das PDF dem Client präsentiert:
https://stackoverflow.com/questions/1395151/content-dispositionwhat-are- ...
Member: martenk
martenk Jul 11, 2019 at 09:12:41 (UTC)
Goto Top
nun noch ein letztes - wie kann ich das mit dem downloadordner regeln - im moment liegt die downlaoddatei im ordner, wo auch die php datei liegt
Member: colinardo
colinardo Jul 11, 2019 updated at 09:19:46 (UTC)
Goto Top
Da du ja offensichtlich noch Lernbedarf bei den PHP-Grundlagen hast bitte, lies das und das Fragezeichen löst sich in Luft auf
https://php-de.github.io/jumpto/pfade/
https://www.opentechguides.com/how-to/article/apache/115/htaccess-file-d ...
Member: martenk
martenk Jul 11, 2019 at 09:23:29 (UTC)
Goto Top
du meinst dann so
$download_path = "/kunden/homepages/30/drtrtrtr/htdocs/download/N8a.pdf";

das klappt nicht
Member: martenk
martenk Jul 11, 2019 updated at 11:54:24 (UTC)
Goto Top
sorry - das klappt face-smile

wenn ich nun aber nach dem download auf eine andere Seite möchte,

ich habs so probiert - klappt leider nicht

$file_to_download = $download_path; // file to be downloaded
header("Expires: 0");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache"); header("Content-type: application/file");
header('Content-length: '.filesize($file_to_download));
header('Content-disposition: attachment; filename='.basename($file_to_download));
readfile($file_to_download);
header('Location: http://www.example.com/');


jetzt hab ich gelesen
It's impossible to output the header after you have output the file.

also kann ich die seite nicht weiterleiten?

wie müsste denn das coding aussehen, wenn es eine normale html seite werden soll - also nach dem header
Member: Henere
Henere Oct 26, 2019 at 12:41:57 (UTC)
Goto Top
Makler... eine Sorte Mensch die ich nicht leiden kann. Hier sieht man mal wieder warum.
Es gibt so viele fertige Softwarelösungen in dem Bereich... kosten halt was....
Member: maretz
maretz Oct 26, 2019 at 12:59:02 (UTC)
Goto Top
Na - das du das nach 3 Monaten gelesen hast und dann ein solch sinnfreies Posting hinbekommst spricht aber auch nicht grad für dich....
Member: Henere
Henere Oct 26, 2019 at 14:31:10 (UTC)
Goto Top
Ist grad zu nem anderen Thema angezeigt worden. Und Makler hab ich grad einen nach dem anderen gefressen. Viel Kohle kassieren aber nix dafür tun wollen.

Sorry für OT