0

PHP を使用して、既に Oracle 10g データベースにアップロードされている blob ファイルをダウンロードしようとしています。私が見つけた多くの例を見て、模倣してきました。このページにアクセスすると、[ファイルのダウンロード] ダイアログが表示され、[開く] または [保存] を選択できます。[開く] をクリックすると、メディア プレーヤーが表示されますが、ファイルを取得することはありません。[保存] を選択すると、「Internet Explorer はこのインターネット サイトを開くことができませんでした。要求されたサイトが利用できないか、見つかりません。後でもう一度やり直してください。」というエラー メッセージが常に表示されます。

以下は、非常に単純で、私が見つけた例とほとんど同じである私のコードです。

<?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;

?>
4

2 に答える 2

0

スクリプトにエラー処理を追加します。oci* 関数のいずれかが失敗する可能性があり、その後の手順も失敗します。ドキュメントには、関数が失敗した場合に何が起こるか、および戻り値がどうなるかが示されています。例えば

戻り値
接続識別子またはエラーの場合に FALSE を返します。

Content-type ヘッダーをできるだけ遅く、つまり最初の出力の直前に設定すると、代わりに何らかのエラー メッセージを含むプレーン テキストまたは html を送信できます。

<?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;
于 2010-08-10T16:12:33.437 に答える