[Perl][Javascript]ファイルをドラッグ&ドロップでサーバにアップロードする

ファイルをドラッグ&ドロップしてサーバにアップロードする方法がやっとわかりました。
肝は以下のところです。

function uploadFile(file){
var formData = new FormData();
formData.append('file', file);
$.ajax({
  async: true,
  type: 'POST',
  contentType: false,
  processData: false,
  url: 'dndtest.cgi',
    data: formData,
    dataType :'html'
}).done(function(){});

ファイルをドラッグ&ドロップしてファイル名などを取得する方法は結構ネットにあがっていますけど、実際にそのファイルをサーバにアップロードする方法を解説するサイトがなく、苦労しました。

  1. FormDataを使う。
  2. ajaxでPOSTする。

ファイルをアップロードする箇所は以下の通りです。

my $q = new CGI;
my @fps = $q->upload('file');
my @fnames = $q->param('file');
my $idx = 0;
foreach my $fname(@fnames){
    $fname = basename($fname);
    copy($fps[$idx], "./test/$fname");
    $idx++;
}

$q->upload()を使うということになかなか気づきませんでした。

以下がソースです。複数ファイルのドラッグ&ドロップにも対応しています。

#!/usr/bin/perl
use strict;
use utf8;
use CGI;
use File::Basename;
use File::Copy;
use File::Path;
use Encode;
use FindBin;

my $q = new CGI;
my @fps = $q->upload('file');
my @fnames = $q->param('file');
my $idx = 0;
foreach my $fname(@fnames){
    $fname = basename($fname);
    copy($fps[$idx], "./test/$fname");
    $idx++;
}
my $out = <<'EOM';
Content-type: text/html

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<script src="http://code.jquery.com/jquery-1.12.4.js">
<script type="text/javascript">
    function PageLoad(e) {
        var dropFrame = document.getElementById('DropFrame');
        dropFrame.addEventListener('dragover', onDragOver, false);
        dropFrame.addEventListener('drop', onDrop, false);
    }
    function onDragOver(e){
        e.preventDefault();
    }
    
    function onDrop(e) {
        e.stopPropagation();
        e.preventDefault();
        
        var files = e.dataTransfer.files; 
        
        for(var i = 0; i < files.length; i++){
            uploadFile(files[i]);
        }
    }
    function uploadFile(file){
        var formData = new FormData();
        formData.append('file', file);
        $.ajax({
            async: true,
            type: 'POST',
            contentType: false,
            processData: false,
            url: 'dndtest.cgi',
            data: formData,
            dataType :'html'
        }).done(function(){});
    }
</script>
</head>
EOM
print(encode('UTF-8', $out)) or die($!);
$out = << "EOM";
<body>
    <div id="DropFrame" style="background-color:#b8deff;border:solid 1px #3470ff; width:360px; height:120px;">ここにファイルをドロップします。<br />@fnames</div>
EOM
print(encode('UTF-8', $out)) or die($!);
$out = << 'EOM';
<script type="text/javascript">
    $(function(){
        PageLoad();
    });
</script>
</body>
</html>
EOM
print(encode('UTF-8', $out)) or die($!);

コメントを残す

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