これは、学生の名前と写真を ID カードに描画する KineticJS コードです。
生徒は自分の名前と写真をカードの周りにドラッグできます。
写真のサイズは変更できませんが、カードの写真領域に収まるように写真を拡大縮小しました。カードのレイアウトを変更すると、KineticJS 画像オブジェクトで幅/高さを簡単に調整できます。
ここにコードとフィドルがあります: http://jsfiddle.net/m1erickson/9jTtb/
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Prototype</title>
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<script src="http://www.html5canvastutorials.com/libraries/kinetic-v4.3.0-beta2.js"></script>
<style>
#container{
border:solid 1px #ccc;
margin-top: 10px;
}
</style>
<script>
$(function(){
var stage = new Kinetic.Stage({
container: 'container',
width: 472,
height: 286
});
var layer=new Kinetic.Layer();
stage.add(layer);
var preload=[];
var images=[];
preload.push("http://dl.dropbox.com/u/139992952/idcard.png");
// I use a demo photo here
// Of course in your live site, you would use URL.createObjectURL
preload.push("http://macmcrae.com/wp-content/uploads/2009/07/bubblebobble.jpg");
preloadImages(preload,init);
function init(images){
KImage("background",0,0,472,286,false,layer,images[0]);
KImage("Photo",284,105,160,160,true,layer,images[1]);
KText("Name",50,190,"Verdana",27,"black",true,layer,"Sam Student");
}
// image preloader
function preloadImages(sources,callback){
var images=[];
var count=0;
for(var i=0;i<preload.length;i++){
images[i]=new Image();
images[i].onload=function(){
if(++count==preload.length){
callback(images);
}
}
images[i].src=preload[i];
}
}
// build the specified KineticJS Image and add it to the stage
function KImage(id,x,y,width,height,isDraggable,layer,img){
var kImg=new Kinetic.Image({
image:img,
id:id,
x:x,
y:y,
width:width,
height:height,
draggable:isDraggable
});
layer.add(kImg);
stage.draw();
}
// build the specified KineticJS Text and add it to the stage
function KText(id,x,y,font,fontsize,color,isDraggable,layer,text){
var kText=new Kinetic.Text({
text:text,
id:id,
x:x,
y:y,
fontFamily:font,
fontSize:fontsize,
fill:color,
draggable:isDraggable
});
layer.add(kText);
stage.draw();
};
}); // end $(function(){});
</script>
</head>
<body>
<div id="container"></div>
<img id="test"/>
</body>
</html>
[OPの追加リクエストに答えるために編集]
あなたのコードを見ましたが、php アップロード スクリプトが見つからなかったので、ここに一般的な考え方を示します。
php.ini で既に構成をセットアップしていると思いますが、特に次のようなものです。
- file_uploads = true;
- upload_max_filesize=2M; // または、ユーザーにアップロードしてもらいたい最大サイズ
- post_max_size=8M;
アップロードしたファイルを保持するファイル フォルダーを既に作成し、Web サーバーの所有権 (または適切なアクセス許可) を付与していると思います。以下のコードは、サブディレクトリが「uploads」であることを前提としています。
次に、以下の PHP コードは、ユーザーの画像をアップロードし、ユーザーの元のファイルと同じ名前を使用して「uploads」ディレクトリに保存します。
境界/エラー チェックが必要な場合は、このコードを変更する必要があります。個人的には、最低限次のことを行います。
- $_FILES は空ではなく、配列です
- $_FILES はエラーが発生しなかったことを報告します
- ファイル名には、これらの英字 [0-9][AZ][.] のみが含まれます。
- ファイル名は250文字以内
- ファイルが空ではありません
- ファイルが upload_max_size 以下です
- ファイルの拡張子は次のいずれかです: .jpg、.jpeg、.gif、.png // または任意の拡張子
- ファイルはまだ存在しません // 上書きまたは救済するロジックを追加します
- 上記のテストの失敗に関するルーチンをキャッチする
php 部分は次のようになります。
<?php
var $uploadDirectory="uploads/"; // or whatever dir you set up
var $maxFileSize=1000000; // or whatever max-size you allowed
// assuming 'file' is the name of your input-type-file tag
// oops, got an error
if ($_FILES["file"]["error"] > 0){echo "Error occured: " . $_FILES["file"]["error"] . "<br>"; }
// get filepaths
var $tempfile=$_FILES["file"]["tmp_name"];
var $basefile=basename($_FILES['file']['name']);
// save the user's file
move_uploaded_file( $tempfile, $uploadDirectory . $basefile );
// do whatever other postback stuff you need to do
?>
HTML フォームは次のようになります。
<form action="upload.php" enctype="multipart/form-data" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
<input type="file" name="file"/>
<input type="submit" name="submit" value="upload" />
</form>