C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: ファイルダウンロード情報の取得方法


(過去ログ 122 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■73040 / inTopicNo.1)  ファイルダウンロード情報の取得方法
  
□投稿者/ kame3 (1回)-(2014/08/13(Wed) 14:35:59)

分類:[C#] 

[環境]
・Windows 7 32bit
・Visual Studio 2010(.NET FRAMEwork 3.5)
・C#
・IE11 + BHO(Browser Helper Objects)

[参考URL]
■MSDN FileDownload event
http://msdn.microsoft.com/en-us/library/aa768282(v=vs.85).aspx

IEアドインで、IEからファイルをダウンロードした情報(ファイル名など)を
取得しようと思っています。
参考URLの情報をもとに下記を実装し、ファイルダウンロード時のイベントは取得しています。
しかし、ダウンロードするファイルの情報を取得できていません。

ファイルダウンロードのイベントが取得できているので、
どこかにファイルダウンロード情報があると思っていますが、
どのように取得すればよいでしょうか?


public void SetSite(Object site)
{
	if (site != null)
	{
		ieInstance = (InternetExplorer)site;
	}
	// ハンドラーの追加
        ieInstance.FileDownload += new DWebBrowserEvents2_FileDownloadEventHandler(ieInstance_FileDownload);
}

// ファイルダウンロード時に発生するイベント
void ieInstance_FileDownload(bool activeDocument, ref bool cancel)
{
  // ファイルダウンロード時にここの処理が走る
}

以上

引用返信 編集キー/
■73044 / inTopicNo.2)  Re[1]: ファイルダウンロード情報の取得方法
□投稿者/ Azulean (333回)-(2014/08/13(Wed) 17:41:47)
こちらと同じ方でしょうか?
http://social.msdn.microsoft.com/Forums/ja-JP/66254903-740c-4a8d-bc76-1fc7386caa5c/bho?forum=netfxgeneralja

もしそうであれば、それぞれのサイトで情報(助言・回答や追加で示した情報など)がかぶったり、漏れたりしないようにフォローをお願いしたいです。
引用返信 編集キー/
■73050 / inTopicNo.3)  Re[2]: ファイルダウンロード情報の取得方法
□投稿者/ まさや (1回)-(2014/08/13(Wed) 23:27:28)
No73044 (Azulean さん) に返信
> こちらと同じ方でしょうか?
> http://social.msdn.microsoft.com/Forums/ja-JP/66254903-740c-4a8d-bc76-1fc7386caa5c/bho?forum=netfxgeneralja
>
> もしそうであれば、それぞれのサイトで情報(助言・回答や追加で示した情報など)がかぶったり、漏れたりしないようにフォローをお願いしたいです。
引用返信 編集キー/
■73051 / inTopicNo.4)  Re[3]: ファイルダウンロード情報の取得方法
□投稿者/ まさや (2回)-(2014/08/13(Wed) 23:31:02)
すみません。
ミスりました。

HttpWebRequest とか、HttpWebResponse は使用されないのですか?




No73050 (まさや さん) に返信
> ■No73044 (Azulean さん) に返信
>>こちらと同じ方でしょうか?
>>http://social.msdn.microsoft.com/Forums/ja-JP/66254903-740c-4a8d-bc76-1fc7386caa5c/bho?forum=netfxgeneralja
>>
>>もしそうであれば、それぞれのサイトで情報(助言・回答や追加で示した情報など)がかぶったり、漏れたりしないようにフォローをお願いしたいです。
引用返信 編集キー/
■73058 / inTopicNo.5)  Re[4]: ファイルダウンロード情報の取得方法
□投稿者/ kame3 (3回)-(2014/08/14(Thu) 17:33:31)
Azuleanさん、まさやさん

コメントありがとうございます。

> >>こちらと同じ方でしょうか?
> >>http://social.msdn.microsoft.com/Forums/ja-JP/66254903-740c-4a8d-bc76-1fc7386caa5c/bho?forum=netfxgeneralja
> >>もしそうであれば、それぞれのサイトで情報(助言・回答や追加で示した情報など)がかぶったり、漏れたりしないようにフォローをお願いしたいです。

同じです。情報にだぶり漏れがないように気をつけます。


> HttpWebRequest とか、HttpWebResponse は使用されないのですか?

可能な限り使用しない方向で考えています。
今回のIEアドインでは、IEのイベントをキャッチして、そのときの情報を取得したいと考えています。
その他のデータの送受信などはIEに任せたいと考えています。

以上
引用返信 編集キー/
■73063 / inTopicNo.6)  Re[5]: ファイルダウンロード情報の取得方法
□投稿者/ 魔界の仮面弁士 (79回)-(2014/08/14(Thu) 20:10:34)
No73040 (kame3 さん) に返信
> [参考URL]
> ■MSDN FileDownload event
> http://msdn.microsoft.com/en-us/library/aa768282(v=vs.85).aspx
aa768282 は「DocumentComplete」イベントの解説ですね。

「FileDownload」なら aa769284 や bb268220 です。
http://msdn.microsoft.com/en-us/library/aa768284
http://support.microsoft.com/kb/325204/en-us


No73058 (kame3 さん) に返信
> 今回のIEアドインでは、IEのイベントをキャッチして、そのときの情報を取得したいと考えています。

少なくとも、 DWebBrowserEvents2 の FileDownload から得られる情報は、
 第一引数(ファイルが Active Document かどうかを取得する)
 第二引数(ダウンロードをキャンセルするか、そのまま続けてダイアログを表示させるかを取得・設定する)
に限られていますよね。
今回は、ダウンロード時に「何」の情報を取得したいのでしょうか?


ダウンロードされる URL など(BeforeNavigate2)
http://msdn.microsoft.com/en-us/library/aa768280

独自のダウンロードマネージャー(IDownloadManager)
http://msdn.microsoft.com/en-us/library/aa753618
http://support.microsoft.com/kb/327865/en-us
http://stackoverflow.com/questions/13362922/windows-forms-webbrowswer-control-with-idownloadmanager

独自プロトコル(URLモニカ)…ms-xhelp:プロトコルなど
http://msdn.microsoft.com/en-us/library/ms775150
http://eternalwindows.jp/com/moniker/moniker01.html


あとは、ローカルプロキシで処理する方法とか。
引用返信 編集キー/
■73071 / inTopicNo.7)  Re[6]: ファイルダウンロード情報の取得方法
□投稿者/ kame3 (4回)-(2014/08/15(Fri) 18:55:08)
魔界の仮面弁士さん
コメントありがとうございます。

■No73063 (魔界の仮面弁士 さん) に返信
> ■No73040 (kame3 さん) に返信
>>[参考URL]
>>■MSDN FileDownload event
>>http://msdn.microsoft.com/en-us/library/aa768282(v=vs.85).aspx
> aa768282 は「DocumentComplete」イベントの解説ですね。
> 
> 「FileDownload」なら aa769284 や bb268220 です。
> http://msdn.microsoft.com/en-us/library/aa768284
> http://support.microsoft.com/kb/325204/en-us

ご指摘の通りです。失礼しました。

> ■No73058 (kame3 さん) に返信
>>今回のIEアドインでは、IEのイベントをキャッチして、そのときの情報を取得したいと考えています。
> 
> 少なくとも、 DWebBrowserEvents2 の FileDownload から得られる情報は、
>  第一引数(ファイルが Active Document かどうかを取得する)
>  第二引数(ダウンロードをキャンセルするか、そのまま続けてダイアログを表示させるかを取得・設定する)
> に限られていますよね。
> 今回は、ダウンロード時に「何」の情報を取得したいのでしょうか?

ダウンロードされるファイル名とダウンロード元のURLです。
(ファイル保存ダイアログで利用者が名前を付けて保存するファイル名ではないです。)

その後調べて見て、ダウンロード元のURLは以下の実装で取得できましたが、
ファイル名の取得できていません。
(URLにファイル名がある場合は、URLから取得できるのですが、そうではない場合もあるので。。。)


public void SetSite(Object site)
{
	if (site != null)
	{
		ieInstance = (InternetExplorer)site;
	}
	// ハンドラーの追加
        ieInstance.FileDownload += new DWebBrowserEvents2_FileDownloadEventHandler(ieInstance_FileDownload);
        ieInstance.DocumentComplete  += new DWebBrowserEvents2_DocumentCompleteEventHandler(ieInstance_DocumentComplete);
}

// ファイルダウンロード時に発生するイベント
void ieInstance_FileDownload(bool activeDocument, ref bool cancel)
{
  // ファイルダウンロード時にここの処理が走る
  downloadFlg = true;
}

void ieInstance_DocumentComplete(object pDisp, ref object URL)
{
  if (downloadFlg)
  {
    // ファイルダウンロードイベントがあった場合の処理
    IHTMLDocument2 document = (IHTMLDocument2)ieInstance.Document;
    string downloadUrl = document.url;  // ダウンロード元のURL
  }
}


下記の情報ありがとうございます。
頂いた情報を基に検討してみます。

> ダウンロードされる URL など(BeforeNavigate2)
> http://msdn.microsoft.com/en-us/library/aa768280
> 
> 独自のダウンロードマネージャー(IDownloadManager)
> http://msdn.microsoft.com/en-us/library/aa753618
> http://support.microsoft.com/kb/327865/en-us
> http://stackoverflow.com/questions/13362922/windows-forms-webbrowswer-control-with-idownloadmanager
> 
> 独自プロトコル(URLモニカ)…ms-xhelp:プロトコルなど
> http://msdn.microsoft.com/en-us/library/ms775150
> http://eternalwindows.jp/com/moniker/moniker01.html
> 
> あとは、ローカルプロキシで処理する方法とか。


以上

引用返信 編集キー/
■73072 / inTopicNo.8)  Re[7]: ファイルダウンロード情報の取得方法
□投稿者/ 魔界の仮面弁士 (80回)-(2014/08/15(Fri) 19:35:26)
No73071 (kame3 さん) に返信
> ダウンロードされるファイル名とダウンロード元のURLです。
> (ファイル保存ダイアログで利用者が名前を付けて保存するファイル名ではないです。)

ダウンロード元の URL は、DocumentComplete で受信できるかと思います。
ただし、フレームを切っているサイトの場合、各フレームごとにイベントが発生しますし、
リロードやリダイレクトを繰り返すページの場合、ダウンロードのイベントと関連付けるのに
苦労するかもしれません。


「ダウンロードされるファイル名」については、基本的には Content-Disposition ヘッダーが
利用されるかと思いますが、同ヘッダーが無い場合は、クエリ文字列を除いた URL の末尾を
ファイル名と看做し、それにコンテンツの内容を元にして既定のファイル名と拡張子が
決定されるかと思います(Content sniffing にも留意して下さい)。ただしこのファイル名は、
その後のユーザー操作によって、別のファイル名に変更されることがあります。

HTTP ヘッダーの取得については、私自身、試したことはありませんが、恐らくは
IHttpNegotiate.OnResponse メソッドに含まれているかと思います。



ところで、BHO の実装のために C# を選択することは、避けた方が良いかも知れません。

http://msdn.microsoft.com/ja-jp/magazine/cc163487.aspx
》 マイクロソフトとしては、最終的に、シェルのアドインを
》 マネージ コードで実装しないことを強くお勧めします。
》 このようなアドインは、サポート対象のシナリオとは見なしていません。

http://blogs.msdn.com/b/oldnewthing/archive/2006/12/18/1317290.aspx
》 Now that version 4 of the .NET Framework supports in-process side-by-side runtimes,
》 is it now okay to write shell extensions in managed code? “The answer is still no.”
引用返信 編集キー/
■73097 / inTopicNo.9)  Re[8]: ファイルダウンロード情報の取得方法
□投稿者/ kame3 (5回)-(2014/08/18(Mon) 23:12:09)
魔界の仮面弁士 さん

コメントありがとうございます。

No73072 (魔界の仮面弁士 さん) に返信
> ■No73071 (kame3 さん) に返信
>>ダウンロードされるファイル名とダウンロード元のURLです。
>>(ファイル保存ダイアログで利用者が名前を付けて保存するファイル名ではないです。)
>
> ダウンロード元の URL は、DocumentComplete で受信できるかと思います。
> ただし、フレームを切っているサイトの場合、各フレームごとにイベントが発生しますし、
> リロードやリダイレクトを繰り返すページの場合、ダウンロードのイベントと関連付けるのに
> 苦労するかもしれません。

この辺りは試行錯誤しながら関連づけしていこうと思います。

> 「ダウンロードされるファイル名」については、基本的には Content-Disposition ヘッダーが
> 利用されるかと思いますが、同ヘッダーが無い場合は、クエリ文字列を除いた URL の末尾を
> ファイル名と看做し、それにコンテンツの内容を元にして既定のファイル名と拡張子が
> 決定されるかと思います(Content sniffing にも留意して下さい)。ただしこのファイル名は、
> その後のユーザー操作によって、別のファイル名に変更されることがあります。
>
> HTTP ヘッダーの取得については、私自身、試したことはありませんが、恐らくは
> IHttpNegotiate.OnResponse メソッドに含まれているかと思います。

情報ありがとうございます。
まずは IHttpNegotiate.OnResponseで取得できるか調べてみます。

> ところで、BHO の実装のために C# を選択することは、避けた方が良いかも知れません。
>
> http://msdn.microsoft.com/ja-jp/magazine/cc163487.aspx
> 》 マイクロソフトとしては、最終的に、シェルのアドインを
> 》 マネージ コードで実装しないことを強くお勧めします。
> 》 このようなアドインは、サポート対象のシナリオとは見なしていません。
>
> http://blogs.msdn.com/b/oldnewthing/archive/2006/12/18/1317290.aspx
> 》 Now that version 4 of the .NET Framework supports in-process side-by-side runtimes,
> 》 is it now okay to write shell extensions in managed code? “The answer is still no.”

この点も調べてみて、検討しようと思います。

以上
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -