Devo inviare il file e le relative proprietà al server GWT.Invio di file e HashMap al server in GWT
Per l'invio di un file ho utilizzato il pannello dei moduli.
public class BrowseFile extends DialogBox {
// more code
// ..
private FormPanel getFormPanel() {
if (formPanel == null) {
formPanel = new FormPanel();
formPanel.setMethod(FormPanel.METHOD_POST);
formPanel.setEncoding(FormPanel.ENCODING_MULTIPART);
formPanel.setAction(GWT.getHostPageBaseURL() +"UploadFileServlet");
formPanel.addSubmitHandler(new FormPanel.SubmitHandler(){
public void onSubmit(SubmitEvent event) {
// TODO Auto-generated method stub
setFilename(fileUpload.getFilename());
}
});
}
return formPanel;
}
}
tutte le proprietà di questo file sono in hashmap
ci sono finestra di dialogo 2 Propertybox extends DialogBox
e
BrowseFile extends DialogBox
all'interno del costruttore della PropertyBox c'è BrowseFile
Quando PropertyBox costruttore
setSize("600px", "670px");
setHTML("Add Document");
setWidget(getVerticalPanel());
browseFile = new BrowseFile();
la proprietà personalizzata all'interno del PropertyBox dipende dalla classe selezionata (classe è albero Widget)
Sul lato server
public class FileUpload extends HttpServlet implements Servlet{
private static final long serialVersionUID = 1L;
private static final Logger log = Logger.getLogger(FileUpload.class
.getName());
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
byte[] buffer = new byte[115200];//
String fileName = null;
String mimetype = null;
String majorVersion = null;
InputStream stream = null;
try {
ServletFileUpload upload = new ServletFileUpload();
FileItemIterator iterator = upload.getItemIterator(request);
while (iterator.hasNext()) {
FileItemStream item = iterator.next();
stream = item.openStream();
if (item.isFormField()) {
//
} else {
fileName = item.getName();
mimetype = item.getContentType();
//
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ByteArrayOutputStream output = new ByteArrayOutputStream();
int len;
while ((len = stream.read(buffer, 0, buffer.length)) != -1) {
output.write(buffer, 0, len);
}
ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());
Session session =RootFolder.getSession();
ContentStream contentStream = session.getObjectFactory()
.createContentStream(fileName, output.size(), mimetype, input);
}
per creare un documento nel repository esterni ho bisogno di documenti di proprietà in hasmap
folder.createDocument (Proprietà documento, contentStream, VersioningState.MAJOR);
La proprietà documento dovrebbe essere inviare a questa classe su onClick
caso di Button ADD
del documento proprietà Class
***** Come inviare l'immobile documento al server in classe FileUpload *****
Ci possono essere più le 200 proprietà. E questa proprietà dipende dalla classe selezionata per il documento e ci sono più di 50 classi di documenti. Quindi aggiungere la hashMap come campo modulo non è una buona opzione e anche la parte di valore di hasmap è una classe che ha 3 variabili (valore, dataType). – NewCodeLearner
@NewCodeLearner Non vedo perché non è possibile aggiungere campi modulo alla richiesta, dopotutto sono dati multipart e quindi possono gestire (quasi) un numero illimitato di campi. E l'enumerazione su HashMap.entrySet non è un grosso problema. Potrei consigliare di serializzare HashMap in un flusso binario e poi inviarlo come dati grezzi - ma questo è un pò di hack e scommetto che non lo vuoi. Si creano campi dinamicamente per ogni tipo di file, li si effettua il marshalling in set di campi modulo sul client e unmarshal sul server, si ottiene l'HashMap insieme al file- e il gioco è fatto. Ha senso? Se no, per favore spiega, perché. – jdevelop
hey non sono molto bravo in programmazione e ne ho poca conoscenza. Proverò wat che stai dicendo. Allora ti farò sapere che voglio lo stesso o no. Grazie. – NewCodeLearner