Да, необходимо сделать его внешним ключом.
преимущества будут лучшей моделью данных с меньшим дублированием.
Вот код из моего приложения:
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");
В 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, если вы хотите, чтобы я отправил вам банку вредоносного кода.
Я бы предложил использовать GWTUpload , потому что это очень просто и продлить. Вы можете добавить его в свой проект менее чем за 10 минут, и он поддерживает GAE прямо из коробки (с помощью GWTUpload-GAE). См. примеры для некоторых распространенных сценариев использования.