XHTMLforum

XHTMLforum (http://xhtmlforum.de/index.php)
-   Serveradministration und serverseitige Scripte (http://xhtmlforum.de/forumdisplay.php?f=80)
-   -   Dateiendung später zusammensetzen (http://xhtmlforum.de/showthread.php?t=70547)

picard_1983 23.01.2014 15:30

Dateiendung später zusammensetzen
 
Hallo zusammen,

ich bin neu hier und versuche mal zu erklären was ich vor habe.
Ich habe ein kleines Tool gebaut was auf Basis PHP läuft.

Hier werden dateien hochgeladen in einen Ordner. Alles kein Problem.
Die hochgeladene Datei wird umbenannt und ohne Dateiendung abgespeichert.

GLeichzeit speichere ich den neuen Dateinamen und die dazugehörige Dateiendung in eine Datenbank. Alles kein Problem.

Jetzt komme ich zu meinen Problem.
Nachdem alles hochgeladen wurde und gespeichert wurde möchte ich die Datei ja wieder aufrufen.

Also machte ich folgendes: Ich setze den Dateinamen und die Endung aus der Datenbank wieder zusammen und wollte ganz normal über href die Datei öffnen.

Da war mein Denkfehler. Er kann die Datei nicht finden weil ich sie ja ohne Dateiendung abgelegt hatte.

Ich weiß aber das es im phpbb2 Forum so läuft. Da wird ebenfalls die Datei umbenannt physikalisch abgelegt ohne Dateiendung und später wird es zusammengestzt und lässt sich auch öffnen.

WIe geht das? Jemand einen Tipp?

Vielen Dank!


Gruß
Picard

gabischatz 23.01.2014 16:10

Und warum fragst du dann nicht in dem Forum?
Grüße

picard_1983 23.01.2014 16:18

Ja ich hatte mich hier mal vor längeren angemeldet.
Dachte jemand hat einen Tipp...

Keiner einen TIpp?

chorn 23.01.2014 16:21

Du kannst die Datei per PHP und readfile() ausliefern lassen. Wenn du vorher die richtigen Header übergibst, hat sie beim Download auch den richtigen Dateinamen.

picard_1983 23.01.2014 16:44

Ok, kannst du mir kurz zeigen wie ich den richtigen Header übergebe?
Ich muss beim Upload den HEader auslesen?

chorn 23.01.2014 18:19

Nein beim Download, wenn du Dateiname + Erweiterung wieder zusammensetzt. Sieh dir einfach mal das Tutorial an und achte auf "filename"

Download per readfile() @ PHP - tutorials.de: Tutorial, Forum, Anleitung & Hilfe

picard_1983 23.01.2014 21:38

So, ich habe mich durchgelesen und einiges zusammengestellt.
Aber so richtig will es noch nicht funktionieren.

Man muss wissen: Die Dateien sind auf dem Server OHNE Dateiendung gespeichert. Der Name und die Endung kommen aus der DB.

z.B.
Datei auf dem Server: 12345tttgggg888

In der DB:

Spalte->Name: 12345tttgggg888
Spalte->Endung: pdf

Im Script will ich es dann zusammensetzen und als download anbieten:

PHP-Code:

<?php

function readfile_chunked($filename
{
  
$chunksize 1*(1024*1024);
  
$buffer '';
  
$handle fopen($filename'rb');
  if (
$handle === false)
  {
    return 
false;
  }
  
  while (!
feof($handle)) 
  {
    
$buffer fread($handle$chunksize);
    print 
$buffer;
    
ob_flush();
    
flush();
  }
  return 
fclose($handle);
}  

$file "12345ttt987";
$endung "pdf";

$datei_komplett $file.".".$endung;

$datei_neu "Testdatei.".$endung;

// Mimetypes definieren, headerdaten ausgeben, readfile_chunked(filepath); ausführen
    
$dateityp = array(
                
'doc'    => 'application/msword',
                
'bin'    => 'application/octet-stream',
                
'exe'    => 'application/octet-stream',
                
'rar'    => 'application/x-rar-compressed',
                
'so'    => 'application/octet-stream',
                
'pdf'    => 'application/pdf',
                
'swf'    => 'application/x-shockwave-flash',
                
'tar'    => 'application/x-tar',
                
'zip'    => 'application/zip',
                
'mpga'    => 'audio/mpeg',
                
'mp2'    => 'audio/mpeg',
                
'mp3'    => 'audio/mpeg',
                
'aif'    => 'audio/x-aiff',
                
'aiff'    => 'audio/x-aiff',
                
'aifc'    => 'audio/x-aiff',
                
'm3u'    => 'audio/x-mpegurl',
                
'ram'    => 'audio/x-pn-realaudio',
                
'rm'    => 'audio/x-pn-realaudio',
                
'rpm'    => 'audio/x-pn-realaudio-plugin',
                
'ra'    => 'audio/x-realaudio',
                
'wav'    => 'audio/x-wav',
                
'bmp'    => 'image/bmp',
                
'gif'    => 'image/gif',
                
'jpeg'    => 'image/jpeg',
                
'jpg'    => 'image/jpeg',
                
'jpe'    => 'image/jpeg',
                
'png'    => 'image/png',
                
'tiff'    => 'image/tiff',
                
'tif'    => 'image/tiff',
                
'mpeg'    => 'video/mpeg',
                
'mpg'    => 'video/mpeg',
                
'mpe'    => 'video/mpeg',
                
'qt'    => 'video/quicktime',
                
'mov'    => 'video/quicktime',
                
'avi'    => 'video/x-msvideo'
            
);
        
//ini_set('memory_limit', '-1');
        
            //$extget = explode(".", $datei_komplett);
            //$extension = $extget[count($extget)-1];
            
            
$sendmime $dateityp[$endung];
            
            
header ("HTTP/1.1 200 OK");
            
header("Content-type: $sendmime");
            
header("Content-Length: ".filesize($file)); // Dateigröße
            
header("Content-Disposition: attachment; filename=\"$datei_neu\"");
            
            
readfile_chunked($file);  


?>

Eventuell kann sich das noch einmal jemand anschauen...wäre echt super.
Also Datenbank auslesen und so das hab ich alles es geht um den download und die Datei zusammensetzen...siehe im script oben. Da habe ich das mal simuliert.

Vielen Dank.

picard_1983 23.01.2014 22:10

Hallo nochmal,

mit diesem Code funktioniert es eigentlich so ich es will. Aber irgendwie habe ich ein ungutes Gefühl. Ist der Code ok?

PHP-Code:

function DownloadFile($file
{
    
$file "123456";
$endung "jpg";

$datei_komplett $file.".".$endung;

$datei_neu "Testdatei.".$endung;

        if(
file_exists($file)) 
        {
            
header('Content-Description: File Transfer');
            
header('Content-Type: application/octet-stream');
            
header('Content-Disposition: attachment; filename='.basename($datei_neu));
            
header('Content-Transfer-Encoding: binary');
            
header('Expires: 0');
            
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            
header('Pragma: public');
            
header('Content-Length: ' filesize($file));
            
ob_clean();
            
flush();
            
readfile($file);
            exit;
        }
        else
        {
            echo 
"Nein";
        }

}

DownloadFile($file); 

Wieso brauch ich hier den Mime-Type nicht mehr herausfinden?

explanator 23.01.2014 22:18

Code nicht angesehen, daher nur zum Mime-type.

Der Mime-type ist nur für die Auswahl der Dateien interessant um diese zu selektieren, dabei wird die Dateiendung zum Vergleich herangezogen,. Du hast aber keine Dateiendung, daher uninteressant.

Siehe auch Dateiformat
und
Internet Media Type

picard_1983 23.01.2014 22:20

Ok, super. Konnte ich mir denken. Also für den eigentlichen Download brauch ich das nicht. Dann werde ich den kürzeren Code vorziehen :)

Danke dir...wenn vielleicht jemand anderen noch Hinweise hat nur zu :)

Thanks!


Alle Zeitangaben in WEZ +2. Es ist jetzt 13:40 Uhr.

Powered by vBulletin® Version 3.8.11 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.

© Dirk H. 2003 - 2023