0

さて、ファイルからダウンロード リンクを作成する PHP スクリプトがあり、そのファイルを C# 経由でダウンロードしたいと考えています。これは進行状況などで正常に機能しますが、PHP ページでエラーが発生すると、プログラムはエラー ページをダウンロードし、要求されたファイルとして保存します。atm のコードは次のとおりです。

PHP コード:

<?php
$path = 'upload/test.rar';

    if (file_exists($path)) {
        $mm_type="application/octet-stream";
        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Cache-Control: public");
        header("Content-Description: File Transfer");
        header("Content-Type: " . $mm_type);
        header("Content-Length: " .(string)(filesize($path)) );
        header('Content-Disposition: attachment; filename="'.basename($path).'"');
        header("Content-Transfer-Encoding: binary\n");
        readfile($path); 
        exit();
    } 
    else {
    print 'Sorry, we could not find requested download file.';
    }
?>

C# コード:

private void btnDownload_Click(object sender, EventArgs e)
    {
        string url = "http://***.com/download.php";
        WebClient client = new WebClient();
        client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
        client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
        client.DownloadFileAsync(new Uri(url), @"c:\temp\test.rar");
    }

    private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        progressBar.Value = e.ProgressPercentage;
    }

    void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
    {
            MessageBox.Show(print);
    }
4

2 に答える 2

1

エラー メッセージを出力する代わりに、ここHeaderに記載されている PHP の関数を使用する必要があります。

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found", true, 404); 

Async 呼び出しの性質上、noWebExceptionがスローされます。DownloadFileCompleted コールバックで、確認できます

if(e.Error != null)

e.Error には のような行が含まれ"The remote server returned an error: (404) Not Found."ます。

于 2012-11-14T22:57:56.103 に答える
1

ダウンロードが成功したときと同じようにヘッダーを設定して、エラーが発生したことを Web クライアントに通知する必要があります。私はPHPにあまり詳しくありませんが、401の例を見つけました

header('HTTP/1.0 401 Unauthorized', true, 401);

ここから

于 2012-11-14T23:01:35.440 に答える