Ответ 1
Для Chrome и Firefox просто используйте это:
form.append("blob",blob, filename);
(см. документация MDN)
В настоящее время я загружаю изображения, вставленные из буфера обмена, следующим кодом:
// Turns out getAsFile will return a blob, not a file
var blob = event.clipboardData.items[0].getAsFile(),
form = new FormData(),
request = new XMLHttpRequest();
form.append("blob",blob);
request.open(
"POST",
"/upload",
true
);
request.send(form);
Выводит поле загруженной формы с получением имени, подобного этому: Blob157fce71535b4f93ba92ac6053d81e3a
Есть ли способ установить это или получить эту клиентскую сторону имени файла, не делая никакой связи на стороне сервера?
Для Chrome и Firefox просто используйте это:
form.append("blob",blob, filename);
(см. документация MDN)
Добавление этого здесь, поскольку оно, кажется, не здесь.
Помимо превосходного решения form.append("blob",blob, filename);
, вы также можете превратить blob в экземпляр File
:
var blob = new Blob([JSON.stringify([0,1,2])], {type : 'application/json'});
var fileOfBlob = new File([blob], 'aFileName.json');
form.append("upload", fileOfBlob);
Поскольку вы получаете данные, вставленные в буфер обмена, нет надежного способа узнать происхождение файла и его свойства (включая имя).
Лучше всего придумать схему имен файлов и отправить вместе с блобом.
form.append("filename",getFileName());
form.append("blob",blob);
function getFileName() {
// logic to generate file names
}
Не проверял, но должен предупредить URL-адрес данных blobs:
var blob = event.clipboardData.items[0].getAsFile(),
form = new FormData(),
request = new XMLHttpRequest();
var reader = new FileReader();
reader.onload = function(event) {
alert(event.target.result); // <-- data url
};
reader.readAsDataURL(blob);
Это имя выглядит на основе идентификатора GUID объекта. Выполните следующие действия, чтобы получить URL-адрес объекта, из которого было получено имя.
var URL = self.URL || self.webkitURL || self;
var object_url = URL.createObjectURL(blob);
URL.revokeObjectURL(object_url);
object_url
будет отформатирован как blob:{origin}{GUID}
в Google Chrome и moz-filedata:{GUID}
в Firefox. Источником является протокол + хост + нестандартный порт для протокола. Например, blob:http://stackoverflow.com/e7bc644d-d174-4d5e-b85d-beeb89c17743
или blob:http://[::1]:123/15111656-e46c-411d-a697-a09d23ec9a99
. Вероятно, вы хотите извлечь GUID и удалить любые тире.
Это действительно зависит от того, как настроен сервер на другой стороне, и с помощью каких модулей он обрабатывает сообщение blob. Вы можете попробовать поместить нужное имя в путь для своего сообщения.
request.open(
"POST",
"/upload/myname.bmp",
true
);
Используете ли вы Google App Engine? Вы можете использовать файлы cookie (сделанные с помощью JavaScript) для поддержания отношений между именами файлов и именем, полученным с сервера.
Когда вы используете Google Chrome, вы можете использовать/злоупотреблять Google Filesystem API
для этого. Здесь вы можете создать файл с указанным именем и записать в него содержимое blob. Затем вы можете вернуть результат пользователю.
Я еще не нашел хороший способ для Firefox; вероятно, для того, чтобы назвать blob, требуется небольшой фрагмент Flash, такой как downloadify
.
IE10 имеет функцию msSaveBlob()
в BlobBuilder
.
Возможно, это больше для загрузки blob, но это связано.