Записывать файлы в Blobstore

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

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

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

Это сработает? Не могли бы вы подумать о другом решении?

Спасибо


person Community    schedule 05.01.2012    source источник
comment
Кстати, этот вопрос не имеет ничего общего с GWT, вам следует удалить тег GWT. Если вы также не хотите спросить, как выполнять multipart в GWT.   -  person Blessed Geek    schedule 05.01.2012


Ответы (2)


I think the only way to serve files from GAE is using the Blobstore, right?

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

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

person Nick Johnson    schedule 05.01.2012
comment
Спасибо, Ник! Проблема в том, что мне нужно обслуживать файл TXT с обработанными данными. Есть ли способ создать этот файл на стороне сервера (GAE), или я должен обслуживать клиентский поток данных и создавать файл TXT на стороне клиента с этими данными? - person ; 05.01.2012
comment
@ user411103 Вам вообще не нужно создавать файл - просто отправьте пользователю текстовые данные. Если вы хотите, чтобы они получали его как загрузку, а не в своем браузере, вам нужно изучить настройку заголовка Content-Disposition (подробности - в Google 'content-disposition attachment'). - person Nick Johnson; 05.01.2012
comment
Спасибо, это именно то, что мне нужно было знать. - person ; 05.01.2012

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

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

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

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

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

Дальнейшие правки

Чтобы ответить клиенту с типом файла, установите тип содержимого ответа или тип mime. например, у меня были приложения, которые динамически создавали файлы GIF, JPG, XLS, CVS и т. д.

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

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

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

Прочтите http://en.wikipedia.org/wiki/Mime-type, чтобы найти тип контента, который вам нужен.

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

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

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

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

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

person Blessed Geek    schedule 05.01.2012
comment
Спасибо! Теперь мне ясно, как загрузить исходный файл ... но мне нужно предоставить пользователю новый текстовый файл с обработанными данными, и я не могу найти способ создать этот файл на стороне сервера в GAE. Должен ли в этом случае обслуживать выходной поток ответа и создавать файл с этими данными на стороне клиента? - person ; 05.01.2012