Записывать файлы в Blobstore - PullRequest
1 голос
/ 05 января 2012

Цель: Предположим, клиент отправляет строку или текстовый файл на сервер (Google App Engine) с помощью веб-формы. Я хочу, чтобы сервер изменил исходный файл и передал его клиенту.

Я думаю, что единственный способ обслуживать файлы из GAE - это использовать Blobstore, верно? Тогда, поскольку мы не можем модифицировать BLOB-объекты, я считаю, что решение будет:

  1. Клиент загружает файл, используя HttpRequest
  2. Сервер читает загруженный файл и копирует его во временный буфер (не уверен, есть ли способ сделать это)
  3. Сервер удаляет оригинальный BLOB-объект
  4. Сервер изменяет данные во временном буфере
  5. Сервер записывает измененный буфер в Blobstore
  6. Сервер передает новый BLOB-объект клиенту

Будет ли это работать? Не могли бы вы подумать о каком-либо другом решении?

Спасибо

Ответы [ 2 ]

5 голосов
/ 05 января 2012
I think the only way to serve files from GAE is using the Blobstore, right?

Неправильно. «Файл» - это просто способ хранения данных на диске; нет ничего о том, чтобы обслуживать их с веб-сервера, который требует, чтобы данные поступали из реального записываемого файла на диске. Вы можете просто принять данные пользователя с помощью загрузки формы, изменить и передать их обратно без необходимости прикасаться к диску, хранилищу больших двоичных объектов или любому другому постоянному носителю.

Это становится проблемой только в том случае, если данные пользователя слишком велики, чтобы поместиться в памяти, и в этом случае вам придется хранить данные где-то во время работы с ними, например в хранилище BLOB-объектов.

2 голосов
/ 05 января 2012

http://code.google.com/appengine/kb/java.html#fileforms

показывает, как это сделать для загрузки файла, который должен выполняться через составные данные формы.

Аналогично для нефайловых данных, где вы читаете прямоиз потока запросов.

Вам даже не нужно сохранять файл / поток ввода.Просто выплюните обработанные данные в поток выходных ответов, одновременно читая входной файл FileItemStream или запрос входного потока.

Если для обработки вашего файла / ввода требуется предварительный просмотр, определите максимальное расстояние просмотра и используйте это расстояние.в качестве размера буфера.

Дополнительные правки

Чтобы ответить клиенту с типом файла, задайте тип содержимого ответа или mime-тип.например, у меня были приложения, которые динамически генерировали gif, jpgs, xls, cvs и т. д.

Нет разницы, является ли источник потока ответов файлом, который вы читаете, или потоком, который вы генерируете динамически.Потому что, даже если у вас есть сохраненный файл, который нужно отправить как ответ клиенту, вам все равно придется преобразовать его в поток ответов и соответствующим образом пометить тип содержимого.

Для динамически генерируемого содержимого, если тольковам нужно кэшировать выходные данные, вам не нужно генерировать файл в веб-видимом URL-адресе, а затем генерировать новую HTML-страницу со ссылкой и отправлять эту HTML-страницу в браузер.Вам не нужно, чтобы браузер пользователя обновлялся сам по себе только для того, чтобы получить эту ссылку.

Вы просто отправили бы «файл» непосредственно в поток ответов.Вы можете спроектировать свой GWT-клиент так, чтобы он принимал «файл», возможно, в именованном фрейме, где src url именованного фрейма - это приложение, которое выполняет динамическую генерацию файла.чтобы найти необходимый вам тип контента.

Если в браузере целевого клиента не настроен обработчик контента для типа контента ответа, это будет как для обработки, так и для загрузки файла.

Я часто использовал jsp или jspx для генерации динамически генерируемых диаграмм или электронных таблиц.Нет сохраненных файлов.Ответ записывается во время чтения запроса.Давайте посмотрим на директиву jsp page, чтобы установить тип содержимого для вызова MS Excel в CSV.

<%@ page language="java" contentType="application/vnd-ms-excel; charset=UTF-8"
    pageEncoding="UTF-8"%>

Для сервлета ServletResponse.setContentType(String)

- это метод для установки содержимого.тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...