Основная загрузка Файла в GWT

Да, необходимо сделать его внешним ключом.

преимущества будут лучшей моделью данных с меньшим дублированием.

45
задан Maksim 10 July 2009 в 18:13
поделиться

3 ответа

Вот код из моего приложения:

1) Я создал класс для приема HTTP-запроса:

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.apache.commons.fileupload.FileItemIterator; 
import org.apache.commons.fileupload.FileItemStream; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 

public class FileUpload extends HttpServlet{
    public void doPost(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {
        ServletFileUpload upload = new ServletFileUpload();

        try{
            FileItemIterator iter = upload.getItemIterator(request);

            while (iter.hasNext()) {
                FileItemStream item = iter.next();

                String name = item.getFieldName();
                InputStream stream = item.openStream();


                // Process the input stream
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                int len;
                byte[] buffer = new byte[8192];
                while ((len = stream.read(buffer, 0, buffer.length)) != -1) {
                    out.write(buffer, 0, len);
                }

                int maxFileSize = 10*(1024*1024); //10 megs max 
                if (out.size() > maxFileSize) { 
                    throw new RuntimeException("File is > than " + maxFileSize);
                }
            }
        }
        catch(Exception e){
            throw new RuntimeException(e);
        }

    }
}

2) Затем в моем web.xml Я добавил эти строки:

<servlet>
    <servlet-name>fileUploaderServlet</servlet-name>
    <servlet-class>com.testapp.server.FileUpload</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>fileUploaderServlet</servlet-name>
  <url-pattern>/testapp/fileupload</url-pattern>
</servlet-mapping>

3) А для form.action сделал следующее:

form.setAction(GWT.getModuleBaseURL()+"fileupload");
57
ответ дан 26 November 2019 в 21:19
поделиться

В GWT вы можете отправить файл на сервер, используя методы http-формы, и вы должны использовать предоставленный HttpServlet для приема и сохранения данных в виде двоичных блогов в Appengine BigTable.

Затем вам понадобится второй HttpServlet, чтобы прочитать файл из bigtable, УСТАНОВИТЬ ТИП MIME В ЗАГОЛОВКЕ HTTP {и параметры кэширования}, а затем передать файл пользователю.

Хотя RPC ОБЯЗАТЕЛЬНО не требуется, вы должны сообщите клиенту, что такое сгенерированный fileId, чтобы они могли получить к нему доступ {если вы не хотите, чтобы пользователь указывал идентификатор и заставлял его беспокоиться о переопределении имени ... ... ick}. Либо вы можете использовать rpc, чтобы запросить список / single id {например, "идентификатор новейшего файла пользователем"}, либо вы можете вернуть этот идентификатор в теле ответа UploadServlet ... но тогда вы должны убедиться, что ваша публикация предназначена это встроенный iframe, опрос, чтобы убедиться, что тело iframe находится между событием отправки и фактическим ответом сервера, а затем проанализируйте и используйте этот идентификатор в gwt для создания тега img или объекта, который использует файл.

Ключевой частью является наличие одного сервлета для загрузки и еще один для загрузки. Помните, что BigTable просто хранит двоичные большие двоичные объекты, поэтому вам также необходимо, чтобы ваш объект данных имел тип mime / content, который можно было бы прочитать из входного файла (никогда не полагайтесь на расширения файлов!}. Кроме того, в BigTable есть 1 МБ на каждую сущность и ограничение на запрос в 10 МБ для бесплатных учетных записей. Вы можете захотеть, чтобы ваш объект данных содержал список из 1-10 больших двоичных объектов, каждый из которых имеет максимальный размер 1024 байта.

По сути, лучше всего найти рабочую бесплатную копию, такую ​​как Google File Service, и расширить ее чтобы узнать, как работает система.

Если хотите, я опубликую свою собственную версию обработки файлов с открытым исходным кодом, как только я закончу работу с виджетами управления gwt и буду считать, что все это достаточно стабильно, чтобы быть полезным для всех. Напишите x AT aiyx DOT info, если вы хотите, чтобы я отправил вам банку вредоносного кода.

5
ответ дан 26 November 2019 в 21:19
поделиться

Я бы предложил использовать GWTUpload , потому что это очень просто и продлить. Вы можете добавить его в свой проект менее чем за 10 минут, и он поддерживает GAE прямо из коробки (с помощью GWTUpload-GAE). См. примеры для некоторых распространенных сценариев использования.

11
ответ дан 26 November 2019 в 21:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: