Базовая загрузка файлов в GWT

Я пытаюсь понять, как загрузить один файл с помощью виджета GWTs FileUpload. Я использую GWT и Google AppEngine с Java, но хочу загрузить файл на свой собственный сервер Linux. У меня уже есть следующий код, но теперь я не могу понять, как отправить свой файл на сервер Google AppServer и сохранить его на другом сервере:

public class FileUploader{

    private ControlPanel cp;
    private FormPanel form = new FormPanel();
    private FileUpload fu =  new FileUpload();

    public FileUploader(ControlPanel cp) {
        this.cp = cp;
        this.cp.setPrimaryArea(getFileUploaderWidget());
    }

    @SuppressWarnings("deprecation")
    public Widget getFileUploaderWidget() {
        form.setEncoding(FormPanel.ENCODING_MULTIPART);
        form.setMethod(FormPanel.METHOD_POST);
        // form.setAction(/* WHAT SHOULD I PUT HERE */);

        VerticalPanel holder = new VerticalPanel();

        fu.setName("upload");
        holder.add(fu);
        holder.add(new Button("Submit", new ClickHandler() {
            public void onClick(ClickEvent event) {
                GWT.log("You selected: " + fu.getFilename(), null);
                form.submit();
            }
        }));

        form.addSubmitHandler(new FormPanel.SubmitHandler() {
            public void onSubmit(SubmitEvent event) {
                if (!"".equalsIgnoreCase(fu.getFilename())) {
                    GWT.log("UPLOADING FILE????", null);
                                        // NOW WHAT????
                }
                else{
                    event.cancel(); // cancel the event
                }

            }
        });

        form.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() {
            public void onSubmitComplete(SubmitCompleteEvent event) {
                Window.alert(event.getResults());
            }
        });

        form.add(holder);

        return form;
    }
}

Что мне делать дальше? Что мне нужно поместить в web.xml и как мне написать свой сервлет, чтобы я мог сохранить файл и вернуть URL-адрес этого объекта (если возможно)


person Maksim    schedule 10.07.2009    source источник


Ответы (5)


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

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");
person KevMo    schedule 10.07.2009
comment
У меня есть то же самое, что и OP: проект размещен на GAE, и я хочу загрузить файл на свой собственный веб-сервер Linux. OP выбрал ваш ответ как лучший ответ, поэтому я думаю, это помогло ему с его вопросом, но я не знаю, где разместить класс FileUpload, находится ли он в GAE вместе с другими файлами проекта? А как насчет Linux-сервера? Как он получит файлы? А где указан адрес? А имя файла? Меня смущает этот фрагмент кода. - person Leo Jweda; 07.02.2010
comment
Разве 10 MiB 10 * 1024 * 1024 не 10 * (1024 * 2), или мегабайты - это альтернативное имя для 2 KiB? - person Stein G. Strindhaug; 16.02.2011
comment
10 * (1024 * 2) - это 20 Кб, но не 10 Мб - person Antonio; 01.05.2011
comment
+1, но я бы хотел, чтобы вы добавили импорт, чтобы мне не пришлось гуглить все до единого. Это: import java.io.InputStream; 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; import org.apache.commons.fileupload.FileUploadException; - person mgiuca; 22.05.2011
comment
Я думаю, вы забыли сказать, что этот JAR должен быть включен в путь к классу: commons.apache.org /fileupload/download_fileupload.cgi - person Erel Segal-Halevi; 20.06.2012
comment
Помогите мне понять. form.setAction (GWT.getModuleBaseURL () + загрузка файла); Является ли файл загрузки каталогом, в котором клиентский код находится там, где настраивается форма? для нажатия кнопки, чтобы вызвать загрузку файла? - person piddler; 14.12.2018
comment
@piddler в номере 3, они включают <url-pattern>/testapp/fileupload/</url-pattern>. Итак, строка, о которой вы спрашиваете, в основном говорит, что когда пользователь отправляет эту форму, отправьте запрос на этот URL-адрес. И затем XML под номером 3 позволяет GWT отправить этот запрос классу FileUpload для обработки. - person Calvin Godfrey; 25.04.2019

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

person rluba    schedule 30.07.2010
comment
Примечание. GWTUpload требует сеансов. - person Riley Lark; 02.05.2012
comment
Каковы плюсы и минусы использования GWTUpload вместо решения, предлагаемого @KevMo - person kroiz; 13.05.2012
comment
GWTUpload позволяет асинхронную загрузку с обновлениями статуса, загрузку нескольких файлов и многое другое. Похоже, это полная замена распространенным альтернативам Flash. - person rluba; 14.05.2012

В 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.

person Community    schedule 12.08.2009

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

Использование собственных компонентов можно выполнить в 3 шага:

  1. Создайте сервлет загрузки файла
  2. Измените web.xml
  3. Сделайте форму загрузки GWT

Что интересно, часть GWT самая простая. Вы можете скопировать мой код на странице Загрузка GWT через 3 простые шаги, если хотите. Удачной загрузки!

person Jeff Richley    schedule 09.07.2012
comment
В принципе, я действительно не вижу разницы в stackoverflow.com/a/1111606/787660, поэтому голосование против, потому что я думаю, что ответ в основном похож, но другой не ссылается на другое место ... - person Chris; 29.03.2013

Здесь вы можете выполнить полную загрузку файла GWT с помощью Progress бар

введите описание изображения здесь

Здесь вы можете ЗАГРУЗИТЬ < / strong> источник

person Suresh Atta    schedule 09.04.2013