Основная загрузка файлов в 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 этого объекта (если это возможно)
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");
Я бы предложил использовать GWTUpload, потому что он очень прост в использовании и расширении. Вы можете добавить его в свой проект менее чем за 10 минут, и он будет поддерживать GAE прямо из коробки (используя GWTUpload-GAE). Смотрите примеры для некоторых распространенных сценариев использования.
В GWT вы можете отправить файл на сервер, используя методы http-формы, и вы должны использовать прилагаемый HttpServlet, чтобы принимать и сохранять данные в виде двоичных блогов в Appengine BigTable.
Затем вам понадобится второй HttpServlet, чтобы прочитать файл из bigtable, УСТАНОВИТЬ ТИП MIME В HTTP-заголовке {и параметры кэширования}, а затем передать файл пользователю.
Хотя RPC НЕ ОБЯЗАТЕЛЬНО необходим, вы должны сообщить клиенту, что такое сгенерированный fileId, чтобы он мог получить к нему доступ (если вы не хотите, чтобы пользователь предоставлял идентификатор и заставлял их беспокоиться о переопределениях имен... ...ick}, Либо вы можете использовать rpc для запроса списка / одного идентификатора {например, "нового идентификатора файла по пользователю"}, либо вы можете вернуть этот идентификатор в теле ответа UploadServlet... но тогда вы должны убедиться, что ваша цель записи это встроенный iframe, опрос, чтобы убедиться, что iframe имеет тело между событием submit и фактическим ответом сервера, а затем проанализировать и использовать этот идентификатор в gwt, чтобы создать тег img или object, который использует файл.
Ключевая часть имеет один сервлет для загрузки, а другой для загрузки. Помните, что BigTable просто хранит двоичные двоичные объекты, поэтому вам также необходимо, чтобы ваша сущность данных имела тип mime/content, который можно прочитать из входного файла {никогда не полагайтесь на расширения файлов!}. Кроме того, в BigTable для каждой сущности имеется 1 МБ, а для бесплатных учетных записей - лимит запросов в 10 МБ. Возможно, вы захотите, чтобы ваш объект данных содержал список из 1-10 больших двоичных объектов, каждый из которых имеет максимальный размер 1024 байта.
По сути, вам лучше всего найти работающую бесплатную копию, такую как Google File Service, и расширить ее, чтобы узнать, как работает система.
Если хотите, я опубликую свою собственную версию обработки файлов с открытым исходным кодом, как только закончу виджеты управления gwt и смогу считать все это достаточно стабильным, чтобы быть полезным для всех. Напишите x AT aiyx DOT info, если вы хотите, чтобы я отправил вам банку с предательским кодом.
Если вы уже не используете другие фреймворки, я настоятельно рекомендую использовать простой ванильный GWT и его нативные компоненты. Если вы используете другие фреймворки, вы можете значительно увеличить размер вашего приложения.
Использование собственных компонентов может быть сделано в 3 этапа:
- Создать файл сервлета загрузки
- Изменить web.xml
- Сделать форму загрузки GWT
Интересно, что часть GWT самая простая. Вы можете скопировать мой код на GWT Upload в 3 простых шага, если хотите. Удачной загрузки!
Здесь вы идете с полной загрузкой файла GWT с индикатором выполнения
Здесь вы можете СКАЧАТЬ источник