2012-01-05 6 views
1

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

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

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

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

Благодаря

+0

BTW, этот вопрос не имеет ничего общего с GWT, вы должны удалить тег GWT. Если вы не захотите спросить, как выполнять мультипроцессор в GWT. –

ответ

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

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

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

+0

Спасибо, Ник! Проблема в том, что мне нужно обслуживать TXT-файл с обработанными данными. Есть ли способ создать этот файл на стороне сервера (GAE), или я должен служить клиенту потоком данных и создавать TXT-файл на стороне клиента с этими данными? – Arturo

+4

@ user411103 Вам вообще не нужно создавать файл - просто отправьте пользователю текстовые данные. Если вы хотите, чтобы они были загружены, а не в их браузере, вы хотите заглянуть в настройку заголовка Content-Disposition (вложение для размещения контента Google). –

+0

Спасибо, это именно то, что мне нужно было знать. – Arturo

2

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

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

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

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

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

Дальнейшие редактирует

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

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

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

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

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

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

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

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

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

является метод, чтобы установить тип содержимого.

+0

Спасибо! Теперь мне ясно, как загрузить исходный файл ... но мне нужно предоставить пользователю новый txt-файл с обработанными данными, и я не могу найти способ создания этого файла на стороне сервера в GAE. Должен ли в этом случае обслуживать выходной поток ответа и создавать файл с этими данными на стороне клиента? – Arturo