Skip to content

Instantly share code, notes, and snippets.

@ku
Created March 25, 2011 09:38
Show Gist options
  • Select an option

  • Save ku/886614 to your computer and use it in GitHub Desktop.

Select an option

Save ku/886614 to your computer and use it in GitHub Desktop.
MediaWiki Drag&Drop to upload
// ==UserScript==
// @name mediawiki_dndupload.user.js
// @description
// @include http://*
// ==/UserScript==
if ( !Object.keys ) {
Object.keys = function (o) {
var keys = [];
for (var i in o) {
keys.push(i);
}
return keys;
}
}
var $A = function (arraylike) {
return Array.prototype.slice.apply(arraylike);
};
document.addEventListener("dragover", function (ev) {
ev.stopPropagation();
ev.preventDefault();
}, true);
document.addEventListener("drop", function (ev) {
var m = document.documentElement.innerHTML.match(/^var wgUserName = "(.+?)"/m);
if (!m) {
alert("login please")
return;
}
var dt = ev.dataTransfer;
ev.stopPropagation();
ev.preventDefault();
var files = dt.files;
window.files = files;
file = window.files[0];
var msg;
if (files.length == 1) {
msg = "Are you sure to upload " + file.fileName;
} else {
msg = "Are you sure to upload " + files.length + " files";
}
if ( window.confirm(msg) ) {
for ( var i = 0; i < files.length; i++ ) {
var file = files[i];
upload(file)
}
}
}, true);
function upload(file) {
var boundary = "---------------------------168072824752491622650073";
var r = new XMLHttpRequest();
r.open("POST", "http://localhost/index.php/%E7%89%B9%E5%88%A5:Upload", false);
r.overrideMimeType('multipart/form-data; boundary=---------------------------168072824752491622650073');
r.setRequestHeader('Content-Type', 'multipart/form-data; boundary=---------------------------168072824752491622650073');
var d = new Date();
d.toUTCString();
var p = d.toDateString().split(/ /);
var m2d = {
Jan:'01',
Feb:'02',
Mar:'03',
Apr:'04',
May:'05',
Jun:'06',
Jul:'07',
Aug:'08',
Sep:'09',
Oct:'10',
Nov:'11',
Dec:'12'
}
var m = document.documentElement.innerHTML.match(/^var wgUserName = "(.+?)"/m);
var user = m[1];
var date = p[3] + m2d[p[1]] + p[2];
var safename = encodeURIComponent(file.fileName).replace(/(%[0-9a-f]{2})/ig, '');
if (safename.match(/^\./)) {
safename = Date.now() + safename;
}
var filename = [user, date, safename].join(".");
var d = {
"wpSourceType": "file",
"wpDestFile" : filename,
"wpUploadDescription" : "",
"wpUpload" : "upload",
wpUploadFile: file
}
var parts = Object.keys(d).map(function (k) {
if ( 'object' == typeof(d[k]) ) {
return [
'Content-Disposition: form-data; name="'+ k + '"; filename="' + (filename) + '"',
'Content-Type: ' + file.type,
'',
file.getAsBinary()
].join("\r\n")
} else {
return [
'Content-Disposition: form-data; name="'+ k + '"; charset="utf-8"',
'',
d[k]
].join("\r\n")
}
} )
var content = '--' + boundary + '\r\n' +
parts.join('\r\n--' + boundary + '\r\n') +
'\r\n--' + boundary + '--';
r.sendAsBinary(content);
//console.log(r);
window.r = r;
var m1 = r.responseText.match(/^var wgServer = "(.+?)"/m);
var m2 = r.responseText.match(/^var wgPageName = "(.+?)"/m);
var m3 = r.responseText.match(/^var wgArticlePath = "(.+?)"/m);
window.m = [m1,m2,m3];
//console.log(m1,m2,m3);
if (m1 && m2 && m3) {
var u = m1[1] + m3[1].replace(/\$1/, encodeURIComponent(m2[1]));
window.open(u)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment