V I S U A L I Z Z A D I S C U S S I O N E |
comm64 |
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>
|
11 U L T I M E R I S P O S T E (in alto le più recenti) |
feeb |
Inserito il - 25/12/2008 : 00:45:56 http://www.raditha.com/megaupload/
Originally created to provide a progress bar support for file uploads with php, the project has grown to cover for JSP/Servlet based file uploads as well. Plans are afoot to release a Perl version of megaupload in the coming weeks. |
comm64 |
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 |
genius |
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 ;) |
comm64 |
Inserito il - 24/12/2008 : 10:39:17 Nel Frattempo, Buon Natale |
genius |
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 ;) |
comm64 |
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 |
comm64 |
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 |
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
|
genius |
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 |
comm64 |
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
|
genius |
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.
}
...
|