Подтвердить что ты не робот

Загрузка основного файла в 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-адрес этого объекта (если возможно)

4b9b3361

Ответ 1

Здесь код из моего приложения:

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");

Ответ 2

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

Ответ 3

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

Затем вам понадобится второй HttpServlet для чтения файла из большой таблицы, установите тип MIME в HTTP HEADER {и параметры кеширования}, а затем передайте файл пользователю.

Несмотря на то, что RPC НЕОБХОДИМО требуется, вы должны сообщить клиенту, что сгенерированный fileId, чтобы он мог получить к нему доступ {если вы не хотите, чтобы пользователь поставлял идентификатор и заставлял их беспокоиться о переопределении имени......ick}. Либо вы можете использовать rpc, чтобы запросить список /single id {например, "самый новый идентификатор файла пользователем" }, или вы можете вернуть этот идентификатор в теле ответа UploadServlet... но тогда вы должны убедиться, что ваш целевой пост это in-page iframe, опрос, чтобы убедиться, что iframe имеет тело между сообщением submit и фактическим ответом сервера, а затем проанализировать и использовать этот id в gwt для создания тега img или object, который использует этот файл.

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

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

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

Ответ 4

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

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

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

Интересно, что часть GWT самая легкая. Вы можете скопировать код GWT Upload в 3 простых шага, если хотите. Счастливая загрузка!