Skip to content

Instantly share code, notes, and snippets.

@1999
Created October 10, 2012 08:05
Show Gist options
  • Save 1999/3863943 to your computer and use it in GitHub Desktop.
Save 1999/3863943 to your computer and use it in GitHub Desktop.
Re-uploading photos from any site to Yandex.Fotki service
var Request = {
init: function (token) {
this._uploadToken = token;
},
load: function (url, params, onSuccess, onError, onProgress, onUploadProgress) {
if (typeof params === "function") {
onUploadProgress = onProgress;
onProgress = onError;
onError = onSuccess;
onSuccess = params;
params = {};
}
var xhr = new XMLHttpRequest();
if (params.responseType && params.responseType !== "json")
xhr.responseType = params.responseType;
params.method = params.method || "GET";
xhr.open(params.method, url, true);
if (params.headers) {
for (var headerName in params.headers) {
xhr.setRequestHeader(headerName, params.headers[headerName]);
}
}
if (typeof onProgress === "function") {
xhr.addEventListener("progress", function (e) {
if (e.lengthComputable) {
var percents = Math.floor((e.loaded / e.total) * 100);
onProgress(percents);
}
}, false);
}
xhr.addEventListener("load", function() {
if (params.responseType) {
if (params.responseType !== "json") {
onSuccess(xhr.response, xhr.status);
} else {
try {
var json = JSON.parse(xhr.responseText);
} catch (e) {
console.log(e.message);
console.dir(e.stack);
console.log(xhr.responseText)
onError("Not JSON: " + xhr.responseText);
return;
}
onSuccess(json, xhr.status);
}
} else {
onSuccess(xhr.responseText, xhr.status);
}
}, false);
xhr.addEventListener("error", function () {
onError("XHR load error (status code " + xhr.status);
}, false);
var data = null;
if (params.data) {
if (params.data instanceof Object) {
if (params.multipart) {
data = new FormData;
for (var key in params.data) {
data.append(key, params.data[key]);
if (params.data[key] instanceof Blob) {
isUploadRequest = true;
}
}
} else {
data = [];
for (var key in params.data) {
data.push(encodeURIComponent(key) + "=" + encodeURIComponent(params.data[key]));
}
data = data.join("&");
}
} else {
data = params.data;
}
}
if (params.data instanceof Object && params.multipart && typeof onUploadProgress === "function") {
xhr.upload.addEventListener("progress", function (e) {
if (e.lengthComputable) {
var percents = Math.floor((e.loaded / e.total) * 100);
onUploadProgress(percents);
}
}, false);
}
xhr.send(data);
},
/**
* @param {String|Array} urls список URL фотографии
* @param {Function} onSuccess принимает:
* @param {Object} JSON-ответ Яндекс.Фоток
*
* @param {Function} onError принимает:
* @param {Number} код ошибки:
* 1 - ошибка загрузки фотографии ИЗ интернета НА локальным компьютер
* 2 - ошибка загрузки фотографии ИЗ интернета НА локальным компьютер (это не фотография)
* 3 - ошибка загрузки фотографии С локального компьютера НА Я.Фотки
* 4 - ошибка загрузки фотографии С локального компьютера НА Я.Фотки (неверный код ответа)
*
* @param {String} текст ошибки
*/
upload: function (urls, onSuccess, onError) {
if ((urls instanceof Array) === false) {
urls = [urls];
}
var self = this;
var picURL = urls.shift();
var id = picURL.replace(/[^a-zA-Z0-9]+/g, "");
this.load(picURL, {
responseType: "blob"
}, function (blob) {
if (/^image\//.test(blob.type) === false) {
if (urls.length) {
self.upload(urls, onSuccess, onError);
} else {
onError(2, picURL + " is not an image: " + blob.type);
}
} else {
self.load("https://api-fotki.yandex.ru/api/users/dmitry-sorin/photos/", {
method: "POST",
responseType: "json",
multipart: true,
headers: {
"Accept" : "application/json",
"Authorization" : "OAuth " + self._uploadToken
},
data: {
image: blob,
disable_comments: "true",
pub_channel: "DayStory YaFotki Uploader",
app_platform: "Chrome App",
app_version: "1.0"
}
}, function (json, statusCode) {
if (statusCode !== 201) {
onError(4, "Wrong upload response code: " + statusCode);
} else {
onSuccess(json);
}
}, onError.bind(null, 3), null, function (prc) {
var elem = document.find("fieldset." + id);
if (elem !== null) {
elem.find("progress.upload").val(prc);
}
});
}
}, onError.bind(null, 1), function (prc) {
var elem = document.find("fieldset." + id);
if (elem !== null) {
elem.find("progress.download").val(prc);
}
});
},
_uploadToken: null
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment