$(function(){
FileTypes = {
image: {
description:'画像ファイル',
matcher:[/^image¥//],
extension: [/¥.jpeg$/i,/¥.jpg$/i, /¥.gif$/i, /¥.png$/i, /¥.svg$/i]
},
audio: {
description:'音声ファイル',
matcher:['audio/mp3'],
extension: [/¥.mp3$/i]
},
video: {
description:'動画ファイル',
matcher:['video/quicktime', 'video/mp4'],
extension: [/¥.mov$/i, /¥.mp4$/i]
},
excel: {
description:'エクセルファイル',
matcher:[
/^application¥/vnd.ms-excel/,
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' // *.xlsx
],
extension: [/¥.xls$/i, /¥.xlsx$/i, /¥.xlsm$/i]
},
csv: {
description: 'CSVファイル',
matcher: ['', ,text/csv', 'application/vnd.ms-excel'],
extension: [ /¥.csv$/i ]
},
xml: {
description: 'XMLファイル',
matcher: ['text/xml']
},
text: {
description: 'テキストファイル',
matcher: ['text/plain']
},
pdf: {
description: 'PDFファイル',
extension: [ /¥.pdf$/i ]
},
zip: {
description: 'ZIPファイル',
extension: [/¥.zip$/i ]
}
};
myDropzone = function(opt) {
var _maxsize = opt.maxfilesize;
var _maxFiles = opt.maxfiles;
var _filetype = opt.filetype;
var _upload_selector = opt.upload;
var _reason = "";
Dropzone.autoDiscover = false;
uiDropzone = new Dropzone(opt.selector, {
"url":"#",
init: function() {
this.on("addedfile", checkUploadStatusHandler),
this.on("removedfile", checkUploadStatusHandler),
this.on("maxfilesexceeded", checkReachHandler)
},
accept: checkAccept,
autoDiscover:false,
autoProcessQueue:false,
paramName: "file",
uploadMultiple:"false",
maxFiles:_maxFiles,
maxFilesize: _maxsize,
addRemoveLinks: 'true',
dictDefaultMessage: '<span class="icon icon-ui-file"></span>ファイルをここにドラッグアンドドロップ<small>またはクリックで場所を指定</small>',
dictFallbackMessage: "ブラウザーがドラッグアンドドロップでのアップロードに対応していません",
dictFileTooBig: "サイズが大きすぎます({{filesize}}MB)。上限は{{maxFilesize}}MBです",
dictInvalidFileType: "この形式のファイルはアップロードできません",
dictResponseError: "エラーが発生しました。コード: {{statusCode}}",
dictCancelUpload: "アップロードをキャンセル",
dictCancelUploadConfirmation: "アップロードをキャンセルしてよろしいですか",
dictRemoveFile: "",
dictMaxFilesExceeded: "アップロード可能なファイル数の上限に達しました。",
});
function checkFiletype(file){
var isMatch = function(str, matcher){
if(str.length==0) return true;
var chk = _.isRegExp(matcher);
if(chk){
return str.match(matcher);
}else{
return str == matcher;
}
return false;
};
var isOK = false;
if (_.isArray(_filetype.matcher) && !_.isEmpty(_filetype.matcher)) {
for (var i = 0; i < _filetype.matcher.length; i++) {
var matcher = _filetype.matcher[i];
var ret = isMatch(file.type, matcher);
if (ret) {
isOK = true;
break;
}
}
if(isOK === false){
_reason = _filetype.description + 'を選択してください。';
return false;
}
}
if (_.isArray(_filetype.extension) && !_.isEmpty(_filetype.extension)) {
isOK = false;
for (var i = 0; i < _filetype.extension.length; i++) {
var ext = _filetype.extension[i];
var ret = isMatch(file.name, ext);
if (ret) {
isOK = true;
break;
}
}
if(isOK === false){
_reason = _filetype.description + 'を選択してください。';
return false;
}
}
if(isOK) {
if(_maxsize > 0 && file.size > (_maxsize*1024*1024)){
。
return false;
}else if(file.size <= 0){
_reason = '空ファイルです。';
return false;
}
return true;
}
}
function checkAccept(file, done){
if (_filetype) {
var isOK = checkFiletype(file);
if(isOK){
$(file.previewElement).find('.dz-error-message').hide();
$(file.previewElement).find('.dz-progress').hide();
done();
}else{
done(_reason);
}
}
}
function checkUploadStatusHandler(){
if(_upload_selector) {
var isOK = true;
if (uiDropzone.files.length==0 || uiDropzone.files.length > _maxFiles) {
isOK = false;
} else {
isOK = true;
for(i=0 ; i < uiDropzone.files.length ; i++) {
isOK = checkFiletype(uiDropzone.files[i]);
if(!isOK) break;
}
}
if(isOK) {
$(_upload_selector).show();
} else {
$(_upload_selector).hide();
}
}
}
function checkReachHandler(file) {
$(_upload_selector).hide();
}
return uiDropzone;
}
});
|