Frage

Mit PHP, Ich versuche, eine BLOB-Datei herunterladen, die bereits an eine Datenbank 10g Oracle hochgeladen wurde. Ich habe gesehen, und imitiert zahlreiche Beispiele, die ich gefunden habe. Wenn ich die Seite ein Datei-Download-Dialog zugreifen erscheint mir zu Öffnen oder Speichern ermöglicht. Wenn ich Öffnen klicken, kommt Media-Player auf, als sollte es aber ruft nie die Datei. Wenn ich Speicher wählen, bekomme ich immer eine Fehlermeldung „Internet Explorer nicht in der Lage war, diese Internet-Seite zu öffnen. Die gewünschte Seite entweder nicht verfügbar oder kann nicht gefunden werden. Bitte versuchen Sie es später noch einmal.“

Unten ist mein Code, der ziemlich geradlinig ist und so ziemlich wie die Beispiele, die ich gefunden habe.

<?php

header('Content-Disposition: attachment; filename='.$_GET['fileName']);
header('Content-length: '.$_GET['fileSize']);
header('Content-type: '.$_GET['mimeType']);

require_once("Include/Application.php");

$connection = oci_connect ($userID, $password, $TNS);

$phpCur = oci_new_cursor($connection);
$stmt = oci_parse($connection, "BEGIN MOR.DOWNLOAD_ATTACHMENT (:morID, :attachmentType, :phpCur); END;");
oci_bind_by_name($stmt, ":morID", $_GET['morID'], -1);
oci_bind_by_name($stmt, ":attachmentType", $_GET['attachmentType'], -1);
oci_bind_by_name($stmt, "phpCur", $phpCur, -1, OCI_B_CURSOR);
oci_execute($stmt);
oci_free_statement($stmt);

$output = '';
oci_execute($phpCur);
while( $row = oci_fetch_array($phpCur) )
    $output .= $row['ATTACHMENT_BL'];

oci_free_statement($phpCur);

oci_close($connection);

echo $output;

exit;

?>
War es hilfreich?

Lösung

mehr Fehlerbehandlung zu Ihrem Skript hinzufügen. Jede der OCI * Funktion kann fehlschlagen, und dann werden die nachfolgenden Schritte auch fehlschlagen. Die Dokumentation sagen Sie, was passiert, wenn eine Funktion ausfällt und was der Rückgabewert sein wird. Z.

Rückgabewerte
Gibt eine Verbindungskennung oder FALSE bei einem Fehler.

Wenn Sie die Content-Type-Header so spät wie möglich eingestellt, das heißt unmittelbar vor dem ersten Ausgang, können Sie Text oder HTML senden, die eine Art von Fehlermeldung enthält statt.

<?php
// error_reporting/ini_set: for testing purposes only.
error_reporting(E_ALL); ini_set('display_errors', 1);

require_once("Include/Application.php");

$connection = oci_connect ($userID, $password, $TNS);
if ( !$connection) {
  die('database connection failed');
}

$phpCur = oci_new_cursor($connection);
if ( !$phpCur) {
  die('creating cursor failed');
}

$stmt = oci_parse($connection, "BEGIN MOR.DOWNLOAD_ATTACHMENT (:morID, :attachmentType, :phpCur); END;");
if ( !$stmt) {
  die('creating statement failed');
}

// and so on and on. Test the return values of each oci* function.

oci_close($connection);

header('Content-Disposition: attachment; filename='.$_GET['fileName']); // at least at basename() here
header('Content-length: '.$_GET['fileSize']); // strange...
header('Content-type: '.$_GET['mimeType']); // possible but still strange...
echo $output;
exit;

Andere Tipps

Verwenden Sie Ihre db Abfrage und führen Sie zuerst, wo ist das Datenfeld ist Blob-Daten:

$sql="SELECT FILE_NAME,data,length(data) as filesize  FROM branch_data where id='$id'";
$r = $db->execute($sql);
$filename=$r->data[0]['FILE_NAME'];
$d=$r->data[0]['DATA'];
$filesize = $r->data[0]['FILESIZE'];
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename="'.$filename.'"');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' .$filesize);  
echo $d->load();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top