画像アップロード

WindowsエクスプローラーやFinderからファイルをドラッグ&ドロップすると、サーバーにアップロードする。

*ファイルは1つずつドロップすること。

* 画像ファイルサイズは、最大25kb程度です。

通信方法の都合上、通信データサイズは25kbの画像で60kb程度になります。

サンプル

ここに画像ファイルをドロップ
この下の画像のプロパティを確認(サーバーにアップされている)

コード

Javascript
----------------------------
// XHRライブラリとしてDabtenを使用
// http://dabten.wi-wi.jp/

function EI(id){return document.getElementById(id);}

onload=function(){

	EI('input').addEventListener('dragover', ImgDragover, true);
	EI('input').addEventListener('drop', ImgDrop, true);

	return true;
};//onload


/************/
function ImgDragover(e) {
	e.stopPropagation();
	e.preventDefault();
}

var gImgName;
var gImgType;
function ImgDrop(e){
	e.stopPropagation();
	e.preventDefault();
	var dt = e.dataTransfer;
	var files = dt.files;

	if(files.length == 0){
		alert('no files');
		return true;
	}
	
	var file;
	var fReader = new FileReader();
	fReader.onloadend = function(e) {
		var reader=e.target;
		var postdata=[
			{name: 'mode', data: 'upload'},
			{name: 'fileupload', data: reader.result, contentType: gImgType, filename: gImgName}
		];
		Dabten.Net.Load('upload.cgi', callback,
			{postData: postdata, method:'POST', enctype:'multipart/form-data'});
	};

	for(var i=0;file=files[i];i++){
		gImgName=file.name;
		gImgType=file.type;
		fReader.readAsBinaryString(file);
	}

}//

function callback(o){

	var img=new Image();
	img.src=o.client.responseText; //return "path/filename"
	imgs.push(img);
	EI('output').appendChild(img);
}




==========================
Perl-CGI
----------------------------
#!/usr/bin/perl
use CGI;

my $cgi=CGI->new;

print $cgi->header(-charset=>'UTF-8');

my $fileupload;
my $fname;
my $localname;
	
$fileupload = $cgi->param('fileupload');
$localname=$fileupload; # localでのファイル名

open(FP,">image.jpg") or die("cannot create file");

# javascriptでescape()されているので、そのまま保存しても画像データにならない
my $filedata;
while(<$fileupload>) {
    $filedata.=$_;
}
$filedata=~s/%([a-fA-F0-9]{2})/pack("C",hex($1))/eg; # javascriptのunescape()に相当

print FP $filedata;

close FP;
close $fileupload;

print $fname.'?localname='.$localname; # xhr.responseText



BACK