今のプロジェクトでドラッグ&ドロップでブラウザファイルアップロードの機能がいる。
検索してみたらたくさん方法が出てきます。その中一番いいと思うのはJqueryを使ってファイルアップロード。
とても勉強になりました、英語のページを翻訳して、ここに転載します。

原文はこちら

これに対してサーバー側のファイル保存について、下記リンクを参照してください。
phpサーバーアップロードファイル保存

*****以下は翻訳内容です*****

jQueryドラッグ&ドロップファイルアップロードの例で、HTML5およびjQuery AJAX APIを使用して、ドラッグ・アンド・ドロップ・ファイル・アップロードを実現する方法について説明しました。
ドラッグ&ドロップはHTML5をサポートするブラウザのみ使えます。
サポートされたブラウザは次のとおりです: IE 10+、Firefox、Chrome、Safari、Opera
live-demo
drag-and-drop-file-upload-jquery

上記のイメージで示されるようにドラッグ&ドロップファイルをアップロードさせるステップに従ってください。

ステップ1、jQueryライブラリをHTMLに引用
[html]
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
[/html]

ステップ2、divタグをアップロード処理したいの所に追加
[html]
<div id="dragandrophandler">ここにドロップしてください。</div>
[/html]
アップロードのdivタグに下記のようなCSSを適用します。
[css]
#dragandrophandler
{
border:2px dotted #0B85A1;
width:500px;
color:#92AAB0;
text-align:left;vertical-align:middle;
padding:10px 10px 10 10px;
margin-bottom:10px;
font-size:200%;
}
[/css]

ステップ3、jQueryでドラッグ&ドロップイベントをハンドル
[javascript]
var obj = $("#dragandrophandler");
obj.on(‘dragenter’, function (e)
{
e.stopPropagation();
e.preventDefault();
$(this).css(‘border’, ‘2px solid #0B85A1’);
});
obj.on(‘dragover’, function (e)
{
e.stopPropagation();
e.preventDefault();
});
obj.on(‘drop’, function (e)
{

$(this).css(‘border’, ‘2px dotted #0B85A1’);
e.preventDefault();
var files = e.originalEvent.dataTransfer.files;

//We need to send dropped files to Server
handleFileUpload(files,obj);
});
[/javascript]
ファイルがdivの外でドロップされた場合、ブラウザで開いてしまいます。それを避けるため、documentの「ドロップ」イベントを防ぐ。
[javascript]
$(document).on(‘dragenter’, function (e)
{
e.stopPropagation();
e.preventDefault();
});
$(document).on(‘dragover’, function (e)
{
e.stopPropagation();
e.preventDefault();
obj.css(‘border’, ‘2px dotted #0B85A1’);
});
$(document).on(‘drop’, function (e)
{
e.stopPropagation();
e.preventDefault();
});
[/javascript]

ステップ4、ファイルがドロップされた時に、HTML5のFormData()を使って、ファイルの中身を読み
[javascript]
function handleFileUpload(files,obj)
{
for (var i = 0; i < files.length; i++)
{
var fd = new FormData();
fd.append(‘file’, files[i]);

var status = new createStatusbar(obj); //Using this we can set progress.
status.setFileNameSize(files[i].name,files[i].size);
sendFileToServer(fd,status);

}
}
[/javascript]

ステップ5、jQuery AJAX APIを使って、FormData()をサーバーに送信
[javascript]
function sendFileToServer(formData,status)
{
var uploadURL ="http://hayageek.com/examples/jquery/drag-drop-file-upload/upload.php"; //Upload URL
var extraData ={}; //Extra Data.
var jqXHR=$.ajax({
xhr: function() {
var xhrobj = $.ajaxSettings.xhr();
if (xhrobj.upload) {
xhrobj.upload.addEventListener(‘progress’, function(event) {
var percent = 0;
var position = event.loaded || event.position;
var total = event.total;
if (event.lengthComputable) {
percent = Math.ceil(position / total * 100);
}
//Set progress
status.setProgress(percent);
}, false);
}
return xhrobj;
},
url: uploadURL,
type: "POST",
contentType:false,
processData: false,
cache: false,
data: formData,
success: function(data){
status.setProgress(100);

//$("#status1").append("File upload Done<br>");
}
});

status.setAbort(jqXHR);
}
[/javascript]

まとめる

以上ステップのソースを纏めって、ドラッグ&ドロップファイルアップロードのサンプルは下記のようになります。
[html]
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<style>
#dragandrophandler
{
border:2px dotted #0B85A1;
width:500px;
color:#92AAB0;
text-align:left;vertical-align:middle;
padding:10px 10px 10 10px;
margin-bottom:10px;
font-size:200%;
}
.progressBar {
width: 200px;
height: 22px;
border: 1px solid #ddd;
border-radius: 5px;
overflow: hidden;
display:inline-block;
margin:0px 10px 5px 5px;
vertical-align:top;
}

.progressBar div {
height: 100%;
color: #fff;
text-align: right;
line-height: 22px; /* same as #progressBar height if we want text middle aligned */
width: 0;
background-color: #0ba1b5; border-radius: 3px;
}
.statusbar
{
border-top:1px solid #A9CCD1;
min-height:25px;
width:700px;
padding:10px 10px 0px 10px;
vertical-align:top;
}
.statusbar:nth-child(odd){
background:#EBEFF0;
}
.filename
{
display:inline-block;
vertical-align:top;
width:250px;
}
.filesize
{
display:inline-block;
vertical-align:top;
color:#30693D;
width:100px;
margin-left:10px;
margin-right:5px;
}
.abort{
background-color:#A8352F;
-moz-border-radius:4px;
-webkit-border-radius:4px;
border-radius:4px;display:inline-block;
color:#fff;
font-family:arial;font-size:13px;font-weight:normal;
padding:4px 15px;
cursor:pointer;
vertical-align:top
}
</style>
</head>

<body>
<div id="dragandrophandler">ここにドロップしてください。</div>
<br><br>
<div id="status1"></div>
<script>
function sendFileToServer(formData,status)
{
var uploadURL ="http://hayageek.com/examples/jquery/drag-drop-file-upload/upload.php"; //Upload URL
var extraData ={}; //Extra Data.
var jqXHR=$.ajax({
xhr: function() {
var xhrobj = $.ajaxSettings.xhr();
if (xhrobj.upload) {
xhrobj.upload.addEventListener(‘progress’, function(event) {
var percent = 0;
var position = event.loaded || event.position;
var total = event.total;
if (event.lengthComputable) {
percent = Math.ceil(position / total * 100);
}
//Set progress
status.setProgress(percent);
}, false);
}
return xhrobj;
},
url: uploadURL,
type: "POST",
contentType:false,
processData: false,
cache: false,
data: formData,
success: function(data){
status.setProgress(100);

$("#status1").append("File upload Done<br>");
}
});

status.setAbort(jqXHR);
}

var rowCount=0;
function createStatusbar(obj)
{
rowCount++;
var row="odd";
if(rowCount %2 ==0) row ="even";
this.statusbar = $("<div class=’statusbar "+row+"’></div>");
this.filename = $("<div class=’filename’></div>").appendTo(this.statusbar);
this.size = $("<div class=’filesize’></div>").appendTo(this.statusbar);
this.progressBar = $("<div class=’progressBar’><div></div></div>").appendTo(this.statusbar);
this.abort = $("<div class=’abort’>Abort</div>").appendTo(this.statusbar);
obj.after(this.statusbar);

this.setFileNameSize = function(name,size)
{
var sizeStr="";
var sizeKB = size/1024;
if(parseInt(sizeKB) > 1024)
{
var sizeMB = sizeKB/1024;
sizeStr = sizeMB.toFixed(2)+" MB";
}
else
{
sizeStr = sizeKB.toFixed(2)+" KB";
}

this.filename.html(name);
this.size.html(sizeStr);
}
this.setProgress = function(progress)
{
var progressBarWidth =progress*this.progressBar.width()/ 100;
this.progressBar.find(‘div’).animate({ width: progressBarWidth }, 10).html(progress + "% ");
if(parseInt(progress) >= 100)
{
this.abort.hide();
}
}
this.setAbort = function(jqxhr)
{
var sb = this.statusbar;
this.abort.click(function()
{
jqxhr.abort();
sb.hide();
});
}
}
function handleFileUpload(files,obj)
{
for (var i = 0; i < files.length; i++)
{
var fd = new FormData();
fd.append(‘file’, files[i]);

var status = new createStatusbar(obj); //Using this we can set progress.
status.setFileNameSize(files[i].name,files[i].size);
sendFileToServer(fd,status);

}
}
$(document).ready(function()
{
var obj = $("#dragandrophandler");
obj.on(‘dragenter’, function (e)
{
e.stopPropagation();
e.preventDefault();
$(this).css(‘border’, ‘2px solid #0B85A1’);
});
obj.on(‘dragover’, function (e)
{
e.stopPropagation();
e.preventDefault();
});
obj.on(‘drop’, function (e)
{

$(this).css(‘border’, ‘2px dotted #0B85A1’);
e.preventDefault();
var files = e.originalEvent.dataTransfer.files;

//We need to send dropped files to Server
handleFileUpload(files,obj);
});
$(document).on(‘dragenter’, function (e)
{
e.stopPropagation();
e.preventDefault();
});
$(document).on(‘dragover’, function (e)
{
e.stopPropagation();
e.preventDefault();
obj.css(‘border’, ‘2px dotted #0B85A1’);
});
$(document).on(‘drop’, function (e)
{
e.stopPropagation();
e.preventDefault();
});

});
</script>
</body>
</html>
[/html]

3 Thoughts on “Jqueryを使ってHTML5ドラッグ&ドロップファイルアップロード”

  • ドラッグ&ドロップでのファイルのアップロードのについていのわかりやすいサイトの説明、ありがとうございます。
    試してみまして、ブラウザではアップロードできるのですが、サーバーにそのファイルを保存するのには、どうすればよろしいのでしょうか?もし、お時間があれば教えて頂ければありがたいです。よろしくどうぞ。

    • ZIROさん
      こんにちは。管理人のKAIです。

      サーバーにアップロードされたファイルの保存、基本にはサーバー側にファイルのコンテンツを受け取ってサーバーのフォルダに保存する。(←_←あたりまえですねへへ)
      言語によって実装方法が違いますが、この基本ルールは変わらないと思います。
      phpサンプルを説明したいと思います。詳しい説明するため、下記ページを作成しました、ご参照ください。
      http://www.it-view.net/php-file-upload-server-save-296.html
      お役に立てれば幸いです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です