Autore |
Discussione |
|
comm64
Utente giovane
Regione: Puglia
Prov.: Foggia
|
Inserito il - 22/12/2008 : 16:44:16
|
Salve gente, tramite degli esempi su internet sono riuscito a creare la mia servlet con relativa pagina JSP per l'upload di file. Vorrei sapere se fosse possibile includere una progress bar nella pagina di upload che mi indichi sullo stato della transazione. Vi allego il mio codice: SERVLET: codice:
import com.oreilly.servlet.*;
//~--- JDK imports ------------------------------------------------------------
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ControllerFiles extends HttpServlet
{
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
// Istanziamo le variabili
// Il ServletContext sevirà per ricavare il MIME type del file uploadato
ServletContext context = getServletContext();
String forw = null;
try
{
// Stabiliamo la grandezza massima del file che vogliamo uploadare
int maxUploadSize = 100000000;
MultipartRequest multi = new MultipartRequest(request, ".", maxUploadSize);
String descrizione = multi.getParameter("text");
File myFile = multi.getFile("myFile");
String filePath = multi.getOriginalFileName("myFile");
String path = "C:\files\";
try
{
// ricaviamo i dati del file mediante un InputStream
FileInputStream inStream = new FileInputStream(myFile);
// stabiliamo dove andrà scritto il file
FileOutputStream outStream = new FileOutputStream(path + myFile.getName());
// salviamo il file nel percorso specificato
while (inStream.available() > 0)
{
outStream.write(inStream.read());
}
// chiudiamo gli stream
inStream.close();
outStream.close();
}
catch (FileNotFoundException fnfe)
{
fnfe.printStackTrace();
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
forw = "/done.jsp";
// mettiamo nella request i dati così da poterli ricavare dalla jsp
request.setAttribute("contentType", context.getMimeType(path + myFile.getName()));
request.setAttribute("text", descrizione);
request.setAttribute("path", path + myFile.getName());
request.setAttribute("size", Long.toString(myFile.length()) + " Bytes");
RequestDispatcher rd = request.getRequestDispatcher(forw);
rd.forward(request, response);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
Pagina JSP codice:
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<form align="center" method="POST" action="ControllerFiles" enctype="multipart/form-data">
<table align="center" border="2" style="border-collapse: collapse">
<tr>
<td align="center"><font size="4" color="yellow">Descrizione</font></td>
<td colspan="2">
<textarea name="text" cols="33" rows="2"></textarea>
</td>
</tr>
<tr>
<td align="center">File</td>
<td>
<input name="myFile" type="file">
</td>
<td align="center">
<input type="submit" name="salva" value="SALVA">
</td>
</tr>
</table>
</form>
</html>
WEB.XML DI TOMCAT codice:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>ControllerFiles</servlet-name>
<servlet-class>ControllerFiles</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ControllerFiles</servlet-name>
<url-pattern>/ControllerFiles</url-pattern>
</servlet-mapping>
</web-app>
|
|
genius
dott. ing. cav. ...FN
Regione: Puglia
Prov.: Bari
Città: Molfetta - Caput Mundi
|
Inserito il - 22/12/2008 : 23:28:42
|
non ho mai fatto una cosa del genere, di jsp non ne so molto (pbolo intervieni plz) ma se fosse possibile inserire graficamente un oggetto JProgressBar all'interno di una jsp, bè non ti resterebbe che fare banalmente una cosa del genere:
...
int max = inStream.available();
nomeBarra.setMaximum(max); // numero di byte totali
nomeBarra.setValue(0); // numero di byte letti
while (inStream.available() > 0)
{
outStream.write(inStream.read());
nomeBarra.setValue(max - inStream.available()); // totali - ancora_da_leggere = quelli letti
// volendo puoi fare in percentuale dividento per 100
// ovviamente troncando o arrotondando.
}
...
|
"...e se non hai morale e se non hai passione se nessun dubbio ti assale perché la sola ragione che ti interessa avere è una ragione sociale soprattutto se hai qualche dannata guerra da fare non farla nel mio nome non farla nel mio nome che non hai mai domandato la mia autorizzazione se ti difenderai non farlo nel mio nome che non hai mai domandato la mia opinione..."
Un blog farlocco |
|
|
comm64
Utente giovane
Regione: Puglia
Prov.: Foggia
|
Inserito il - 22/12/2008 : 23:59:02
|
Ciao, stavo provando un'altra strada.. quella di creare un'applicazione client java swing che comunicasse con la servlet in modo tale da poter inserire la bella JprogressBar e mi sono esaurito senza raggiungere un risultato. La Documentazione è sempre poca e sempre in Inglese. Sembra quasi che certe cose siano segrete in ambito Java. Ho trovato solo librerie a pagamento ... Quasi quasi ci rinuncio.. (causa esaurimento nervoso)
Ciao A tutti
|
Modificato da - comm64 in data 22/12/2008 23:59:41 |
|
|
genius
dott. ing. cav. ...FN
Regione: Puglia
Prov.: Bari
Città: Molfetta - Caput Mundi
|
Inserito il - 23/12/2008 : 18:55:02
|
quindi tu vuoi fare una cosa del genere:
pagina html + applet <- lato client servlet <- lato server
e vorresti far comunicare questa cosa? A naso non mi sembra così difficile, che problemi hai con l'applet?
n.b. tieni sempre presente le limitazioni imposte alle applet |
"...e se non hai morale e se non hai passione se nessun dubbio ti assale perché la sola ragione che ti interessa avere è una ragione sociale soprattutto se hai qualche dannata guerra da fare non farla nel mio nome non farla nel mio nome che non hai mai domandato la mia autorizzazione se ti difenderai non farlo nel mio nome che non hai mai domandato la mia opinione..."
Un blog farlocco |
|
|
comm64
Utente giovane
Regione: Puglia
Prov.: Foggia
|
Inserito il - 23/12/2008 : 19:03:30
|
Praticamente creare una applicazione o Applet (che provvederò a creare un certificato sennò non mi funzionerà mai a causa delle limitazioni di sicurezza imposte), che sostituisca la pagina JSP nell'upload
Il problema è come sostituire quello che fa la pagina JSP in una classe java. Cioè inviare un file di tipo multipart/form-data alla servlet in questione, ipotizzando che si trovi su Htpp://localhost/Application/MiaServlet
|
Modificato da - comm64 in data 23/12/2008 19:05:07 |
|
|
comm64
Utente giovane
Regione: Puglia
Prov.: Foggia
|
Inserito il - 23/12/2008 : 19:36:21
|
Forse ce l'ho fatta:) usando le librerie apache commons Http
Sono in fase di sperimentazione |
|
|
comm64
Utente giovane
Regione: Puglia
Prov.: Foggia
|
Inserito il - 23/12/2008 : 21:10:42
|
E' Ufficiale.Sono riuscito a inviare un file alla mia servlet (per essere sinceri + di uno contemporaneamente.. upload multiplo.) Allego il codice perchè mi piace condividere sperando di far cosa utile. "Naturalmente non ho applicato le regole di Ingegneria del Software e tanti controlli che sono utili, quindi il codice non è strutturato come si deve ma basta per capire come fare." Obiettivo: Fare l'upload di file da applicazione stand-alone o applet su server sfruttando la servlet. La servlet è la stessa del post in alto.. Lato client invece:Applet (per provarla non usate il browser perchè deve essere firmata tramite certificato)Potete cmq inserire il codice in un Jframe
//~--- JDK imports ------------------------------------------------------------
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
public class UploadApplet extends javax.swing.JApplet {
private File[] fileScelti;
private JButton jBtbUpload;
private JList jList1;
private JScrollPane jScrollPane1;
private JButton jUploadBtb;
public UploadApplet() {
super();
initGUI();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame();
UploadApplet inst = new UploadApplet();
frame.getContentPane().add(inst);
((JComponent) frame.getContentPane()).setPreferredSize(inst.getSize());
frame.pack();
frame.setVisible(true);
}
});
}
private void initGUI() {
try
{
setSize(new Dimension(400, 300));
getContentPane().setLayout(null);
{
jScrollPane1 = new JScrollPane();
getContentPane().add(jScrollPane1);
jScrollPane1.setBounds(27, 22, 273, 129);
{}
}
{
jUploadBtb = new JButton();
getContentPane().add(jUploadBtb);
jUploadBtb.setText("Apri");
jUploadBtb.setBounds(319, 22, 46, 26);
jUploadBtb.setFont(new java.awt.Font("Tahoma", 0, 8));
jUploadBtb.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent evt) {
jUploadBtbMouseClicked(evt);
}
});
}
{
jBtbUpload = new JButton();
getContentPane().add(jBtbUpload);
jBtbUpload.setText("Upload");
jBtbUpload.setBounds(142, 194, 91, 34);
jBtbUpload.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent evt) {
jBtbUploadMouseClicked(evt);
}
});
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
private void jUploadBtbMouseClicked(MouseEvent evt) {
JFileChooser chooser = new JFileChooser();
chooser.setMultiSelectionEnabled(true);
chooser.showOpenDialog(this);
File[] files = chooser.getSelectedFiles();
this.fileScelti = files;
String elementi[] = new String[files.length];
for (int i = 0; i < files.length; i++) {
elementi[i] = files[i].getName();
System.out.println(files[i].getPath());
}
jList1 = new JList(elementi);
jScrollPane1.setViewportView(jList1);
jList1.setPreferredSize(new java.awt.Dimension(486, 262));
}
private void jBtbUploadMouseClicked(MouseEvent evt) {
String url = "http://localhost:80/Massimo/ControllerFiles";
HtppUpload up = new HtppUpload();
up.setURL(url);
up.setTargetFile(fileScelti);
up.UploadFile();
}
} Classe per l'upload
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.httpclient.params.HttpMethodParams;
//~--- JDK imports ------------------------------------------------------------
import java.io.File;
public class HtppUpload {
private String URL;
private File[] targetFile;
public void UploadFile() {
for (int i=0; i<targetFile.length; i++)
{
PostMethod filePost = new PostMethod(URL);
filePost.getParams().setBooleanParameter(HttpMethodParams.USE_EXPECT_CONTINUE, false);
try
{
Part[] parts = { new FilePart(targetFile[i].getName(), targetFile[i]) };
filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));
HttpClient client = new HttpClient();
client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
int status = client.executeMethod(filePost);
if (status == HttpStatus.SC_OK) {
System.out.println("Upload complete, response= " + filePost.getResponseBodyAsString());
} else {
System.out.println("Upload failed, response=" + HttpStatus.getStatusText(status));
}
}
catch (Exception ex)
{
System.out.println("ERROR: " + ex.getClass().getName() + " " + ex.getMessage());
ex.printStackTrace();
}
finally
{
filePost.releaseConnection();
}
}
}
public String getURL() {
return URL;
}
public void setURL(String url) {
URL = url;
}
public File[] getTargetFile() {
return targetFile;
}
public void setTargetFile(File[] targetFile) {
this.targetFile = targetFile;
}
}
Con questa applicazione si può fare l'upload multiplo selezionando una sola volta con ALT+File nella JFilechooser sorpassando quindi le limitazioni delle pagine jsp e html che vogliono per forza che si deve selezionare per ogni file.
Una domanda x genius: adesso potrei inserire la JprogressBar.. che ne pensi? devo solo capire come fare |
|
|
genius
dott. ing. cav. ...FN
Regione: Puglia
Prov.: Bari
Città: Molfetta - Caput Mundi
|
Inserito il - 24/12/2008 : 09:34:48
|
si ora puoi sicuramente farlo, aggiungi la tua progress bar alla gui, devi strutturare un pò meglio il codice, ma in linea di massima puoi usare il metodo che ti ho descritto sopra.
Oggi per ovvie ragioni dubito di poter far + di questo, ma se posso e non sei ancora riuscito nel frattempo, nei prox giorni ti prometto che do uno sguardo + completo al codice, e magari vedo se riesco a darti una mano + concreta ;)
EDIT: ho visto che hai eliminato il ciclo in cui inviavi il file perchè stai usando HttpClient... forse ora è + difficile tenere traccia dei progressi, ma vedrò meglio ;) |
"...e se non hai morale e se non hai passione se nessun dubbio ti assale perché la sola ragione che ti interessa avere è una ragione sociale soprattutto se hai qualche dannata guerra da fare non farla nel mio nome non farla nel mio nome che non hai mai domandato la mia autorizzazione se ti difenderai non farlo nel mio nome che non hai mai domandato la mia opinione..."
Un blog farlocco |
|
|
comm64
Utente giovane
Regione: Puglia
Prov.: Foggia
|
Inserito il - 24/12/2008 : 10:39:17
|
Nel Frattempo, Buon Natale |
|
|
genius
dott. ing. cav. ...FN
Regione: Puglia
Prov.: Bari
Città: Molfetta - Caput Mundi
|
Inserito il - 24/12/2008 : 10:55:49
|
ho trovato questo, ma usa ftp :S http://coding.derkeiler.com/Archive/Java/comp.lang.java.gui/2005-11/msg00045.html
cmq auguri anche a te ;) |
"...e se non hai morale e se non hai passione se nessun dubbio ti assale perché la sola ragione che ti interessa avere è una ragione sociale soprattutto se hai qualche dannata guerra da fare non farla nel mio nome non farla nel mio nome che non hai mai domandato la mia autorizzazione se ti difenderai non farlo nel mio nome che non hai mai domandato la mia opinione..."
Un blog farlocco |
|
|
comm64
Utente giovane
Regione: Puglia
Prov.: Foggia
|
Inserito il - 24/12/2008 : 12:13:46
|
Ho trovato anche questo suggerimento su un forum: Hi,
One way is to override sendData from org.apache.commons.httpclient.methods.multipart.FilePart and add your custom code for monitoring and calculating progress file upload.
Regards, Ivica
mo dovrei capire come metterlo in pratica |
|
|
feeb
Cantù Che Conta Col Cayenne
Prov.: Zara
|
|
|
Discussione |
|