Может ли Dropbox Saver принимать данные от createObjectURL()?

Инструменты Dropbox Chooser и Saver кажутся очень полезными для следующих двух задач:

  • Пусть пользователь выберет файл из своего Dropbox, и страница сможет его загрузить (т.е. Dropbox-to-client).
  • Пусть пользователь выберет в своем Dropbox пункт назначения, в который будет сохранен файл, расположенный по какому-то URL-адресу на сервере (т. Е. С сервера в Dropbox).

Это асимметрично. Этот вопрос Stackru спрашивает, возможно ли отправить файл в Dropbox Saver непосредственно с клиента. (Это особенно удобно, если вы пишете приложение только для клиента и хотите, чтобы Dropbox заменял сервер.)

Комментарий в одном ответе говорит, что Core API или Sync API могут это сделать. Но было бы стыдно вводить эти более сложные API, если они не нужны; Chooser и Saver восхитительно просты в использовании. Кроме того, мне неясно, будет ли в этом случае доступным пользовательский интерфейс Saver.

Мой вопрос: Какой самый простой способ сохранить файл с клиента (например, из данных в createObjectURL URL) в Dropbox пользователя, все еще используя Saver UI, если это возможно? (Под "самым простым" я подразумеваю краткий, легко читаемый и поддерживаемый код.) Конкретный код JavaScript был бы идеальным.

1 ответ

Решение

Как и в комментарии Джеймса Фостера выше, Dropbox теперь принимает URI данных. Следовательно, если у вас есть данные в виде URI данных, можно вызвать Dropbox.save(dataURI,filename,options) как задокументировано здесь.

Но есть небольшая проблема: для создания URI данных обычным способом (с FileReader) требуется асинхронный вызов readAsDataURL. Но Dropbox.save() может быть вызван только в ответ на взаимодействие с пользователем (например, щелчок). Так что в обработчике кликов, если вы сначала должны асинхронно создать URI данных, то к тому времени, когда вы доберетесь до обратного вызова, Dropbox.save() функция больше не может быть вызвана.

В моем случае было возможно создать URI данных без API-интерфейса FileReader, поскольку я хранил только HTML-данные. Можно просто написать "data:text/html,"+encodeURIComponent(myHTMLData) создать URI данных, как описано здесь. Для нетекстовых данных это решение не будет работать, и вам придется попробовать что-то более сложное, например, то, что описано здесь.

Другие вопросы по тегам