Javascript で質問があります。


HTMLタグでファイルを参照するには、
<input type="file" name="fileGetterName" size="16">
と打ち込めばファイルが参照できますが、フォルダを指定したい場合、HTMLタグでは無理だとわかりました。

そこで、Javascriptを使用してフォルダを指定してCGIに渡したいのですが、可能でしょうか?

回答の条件
  • URL必須
  • 1人20回まで
  • 登録:2007/08/10 11:37:39
  • 終了:2007/08/17 12:56:36

回答(4件)

id:minkpa No.1

minkpa回答回数4178ベストアンサー獲得回数552007/08/10 12:56:07

id:zachouR

ありがとうございます

2007/08/16 10:57:12
id:KUROX No.2

KUROX回答回数3542ベストアンサー獲得回数1402007/08/10 21:03:02

ポイント23pt

Javascriptを使用して、

ファイルダイヤログを開いて、フォルダを選択させて

フォルダ名をCGIに渡したいという意味だと思うのですが、

それは無理だと思います。

JavaApletとかActiveXとか組み込めば可能だと

思いますが・・。

http://q.hatena.ne.jp/answer

id:zachouR

やはり、JAVAでなければ無理ですか、、、ありがとうございます

2007/08/16 10:57:57
id:hiramatsu_kg No.3

hiramatsu_kg回答回数424ベストアンサー獲得回数32007/08/10 23:12:20

id:zachouR

ありがとうございます

2007/08/16 10:58:01
id:lunlumo No.4

lunlumo回答回数107ベストアンサー獲得回数142007/08/15 22:43:20

ポイント22pt

 複数ファイルの一括アップロードであれば,BFup等を使えば可能です。

http://www.hi-ho.ne.jp/babaq/bfup.html

http://swfupload.mammon.se/index.php

 IE+JavaScriptであれば,かなり無理繰りですが,以下の様なスクリプトで出来るようです。

function selectFolder() {
	var dir = "";
	var objIE = null;
	try{
		objIE = new ActiveXObject( "InternetExplorer.Application" );
	}catch(e){
		return "";
	}
	objIE.Navigate( "C:\\" );
	while (objIE.ReadyState != 4) true;
	
	var objShell = objIE.Document.Application;
	var objFolder = objShell.BrowseForFolder( 0, "フォルダを選択してください", 0);
	if (objFolder) {
		try {
			dir = objFolder.Self.Path;
		} catch (e) {}
	}
	objIE.quit();

	return dir;
}
function upload() {
	var	dir = selectFolder();
	if (dir != "") {
		var	fs = new ActiveXObject("Scripting.FileSystemObject");
		var	httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
		var	folder = fs.GetFolder(dir);
		var	boundary = "directory_update";
		var	requestBody = "";
		var files = folder.Files;
		var e = new Enumerator(files);
		while (!e.atEnd()) {
			var	file = e.item();
			var	ts = file.OpenAsTextStream(1,-2);
			requestBody +=
				'--' + boundary + '\r\n' +
				'Content-Disposition: form-data; name="files"; filename="' + escape(file.Name) + '"' + '\r\n' +
				'Content-Type: application/octet-stream' + '\r\n' +
				'\n' +
				ts.ReadAll() + '\r\n';
			ts.Close();
			e.moveNext();
		}
		requestBody += '--' + boundary + "--";
		httpRequest.Open("POST", "http://www.nowhere.com/cgi-bin/test.cgi", false);
		httpRequest.setRequestHeader("Content-type", "multipart/form-data; boundary=\"" + boundary + "\"");
		httpRequest.setRequestHeader("Connection", "close");
		httpRequest.setRequestHeader("Content-length", requestBody.length);
		httpRequest.send(requestBody);
	}
}

 フォルダの選択処理は少し無理があるので,ファイルを選択して同じディレクトリ下のファイルを処理するか,ユーザに処理対象のファイルを選択させる様にした方が良いかもしれません。送信処理についてもかなり端折って書いているので,バイナリファイルの考慮であるとか,実際に使うのであれば処理を作りこむ必要があるでしょう。

id:zachouR

ありがとうございます。

ちょっと実験してみます。

現在はファイルを指定させてそこからフォルダまでのパスを抽出するようにしています。

ありがとうございました

2007/08/16 10:59:01
  • id:mj99
    フォルダ名のみをcgiに送信したい、ではなく、指定のフォルダ配下のすべてのファイル実体をcgiに送信したい、ということでしょうか。

    もしコレが可能だとすれば、「訪問しただけで自動的にドライブ(例えばc:\以下)すべてをサーバに送信するWebページ」をつくれてしまうことになりますね、、、、。

    ----
    IE限定で、ActiveXの実行制限がゆるい場合には、期待する動作を実現できるかもしれません。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません