Ayuda con envio de archivo en sitio web

Hola que tal.

Estoy realizando en sitio web con ayuda de java 7, myeclipse, struts 1.3, jsp y jboss 5.1.

Necesito que mi sitio web busque un archivo en la maquina local y lo envié por medio de FTP a otra maquina.

la carga de la ruta del archivo la hago con ayuda del JFileChooser desde mi codigo de java:

//Seleccionanmos el archivo a subir
JFileChooser fileChooserCargar = new JFileChooser();
fileChooserCargar.setDialogTitle("Abrir");
int seleccion = fileChooserCargar.showOpenDialog(null);

if (seleccion == JFileChooser.APPROVE_OPTION){
file = fileChooserCargar.getSelectedFile();
}else{
return "Cancelado por el usuario";
}

/**Nos conectamos**/
cliente.connect(sFtp, sPort);
boolean login = cliente.login(sUsuario, sPassword);

if(login){
System.out.println("conectado!!!!");
}else{
System.out.println("Tenemos un problema");
}

//validamos si la carpeta es la raiz o una de cargos recurrentes
if (carpeta != null && !carpeta.trim().isEmpty()){
cliente.changeWorkingDirectory("\\" + carpeta);
}
System.out.println("Directorio raiz: " + cliente.printWorkingDirectory());

//barremos el contenido del directorio.
for (FTPFile f : cliente.mlistDir()) {
// revisamos que no haya otro archivo con el mismo nombre
if(!f.isDirectory() && file.getName().equals(f.getName())){
System.out.println("El archivo " + f.getName() + " ya existe");
return "El archivo \"" + f.getName() + "\" ya existe";
}
}

//enviamos el archivo
cliente.setFileType(FTP.BINARY_FILE_TYPE);
System.out.println("archivo: " + file.getAbsolutePath());

filein = new FileInputStream(file);
cliente.enterLocalActiveMode();
subio = cliente.storeFile(file.getName(), filein);

String mensaje;

if (subio){
return "¡Archivo enviado creectamente!";
}else{
return "¡El archivo no se pudo enviar!";
}

Mi duda es que si tendría problemas cuando suba mi sitio a producción, ya que intentaría buscar el archivo a enviar en el servidor y no el pc local.

Si esto es correcto ¿como le podría hacer para que mi sitio busca un archivo en una ruta local y lo envie por ftp?

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

mal

Está muy mal lo que estás haciendo, porque el JFileChooser aparece en el SERVER, no en el cliente. Obvio cuando pruebas esto en desarrollo te funciona porque server y cliente son la misma máquina porque corres el server en tu equipo y ahí mismo entras con el browser a ver la página. Y digo MUY mal porque esto es indicativo de que traes una confusión grave con lo que corre en el server y en el cliente, a nivel conceptual incluso.

Para subir archivos usas el <input type="file"> en tu página, puedes usar el commons-fileupload en el server para facilitar la recepción del archivo.

Y aún así... bueno, no sé si sea lo óptimo que el cliente mande un archivo al server y luego el server tiene que enviarlo por ftp a otro lugar; no es más fácil que el cliente lo envíe directo al destino final por ftp sin pasar por tu aplicación? (obvio hay mil cosas de tu aplicación que no conocemos y tal vez haya restricciones por las cuales esto es necesario).

falta de permisos

Desde las maquinas que consultaran el sitio no tienen permisos hacia el servidor donde me conecto al FTP solo tiene permiso el servidor donde esta alojado el sitio.

Creo que la unica manera seria que el del cliente envie al server y del server hacia el otro server donde esta el FTP.

voy a probar el que mencionas.

Imagen de neko069

Si es la única manera,

Si es la única manera, podrías tratar de aminorar, o incluso eliminar el que alguien intervenga, con un File Listener así cuando se suba un fichero al servidor, lo colocas en un folder en específico, el listener lo escanea y ahí mismo lo envía por ftp.

Aunque lo cierto es que te informes bien si puedes eliminar ése tipo de intervenciones, que yo sepa, para un servidor FTP necesitas usuario y contraseña, no es un equipo determinado al que se le dan permisos para enviar/recibir ficheros por el FTP.

Resuelto

Gracias ezamudio.

Quedo con el 'input type="file"'

Les comparto el codigo donde hago el envio:

private String subeArchivoFtps(String carpeta, FormFile myFile) throws MyException{
               
                FTPClient cliente = new FTPClient();
                String mensaje = null;
                FileInputStream filein = null;
                boolean subio;
                InputStream inS = null;
               
                try{
                        /**Nos conectamos**/
                        cliente.connect(sFtp, sPort);
                        boolean login = cliente.login(sUsuario, sPassword);
                       
                        if(login){
                                System.out.println("conectado!!!!");
                        }else{
                                System.out.println("Tenemos un problema");
                        }
                                               
                        //validamos si la carpeta es la raiz o una diferente
                        if (carpeta != null && !carpeta.trim().isEmpty()){
                                cliente.changeWorkingDirectory("\\" + carpeta);
                        }
                        System.out.println("Directorio raiz: " + cliente.printWorkingDirectory());
                       
                       
                        //barremos el contenido del directorio.
                        for (FTPFile f : cliente.mlistDir()) {
                                // revisamos que no haya otro archivo con el mismo nombre
                                if(!f.isDirectory() && myFile.getFileName().equals(f.getName())){
                                        System.out.println("El archivo " + f.getName() + " ya existe");
                                        return "El archivo \"" + f.getName() + "\" ya existe";
                                }
            }
                       
                        int replay = cliente.getReplyCode();
                       
                        if(FTPReply.isPositiveCompletion(replay)){
                                System.out.println("conectado para subir el archivo");
                       
                                cliente.setFileType(FTP.BINARY_FILE_TYPE);
                               
                                inS = new BufferedInputStream(myFile.getInputStream());
                                cliente.enterLocalActiveMode();
                                subio = cliente.storeFile(myFile.getFileName(), inS);
                               
                                if (subio){
                                        mensaje = "¡Archivo enviado creectamente!";
                                }else{
                                        mensaje = "¡El archivo no se pudo enviar!";
                                }
                               
                                System.out.println("**************************************************");
                                System.out.println(mensaje);
                                System.out.println("**************************************************");
                        }else{
                                System.out.println("No se pudo subir el archivo verifica que estás conectado");
                        }
                }catch(IOException e){
                        System.out.println("Exception: " + e.getMessage());
                        throw new MyException("Error al enviar el archivo al FTP: " + e.getMessage());
                }finally{
                        try {
                                inS.close();
                        } catch (IOException e) {
                                System.out.println("archivo.close: " + e.getMessage());
                        }
                        try {
                                cliente.logout();
                        } catch (IOException e) {
                                System.out.println("cliente.logout: " + e.getMessage());
                        }
                        try {
                                cliente.disconnect();
                        } catch (IOException e) {
                                System.out.println("cliente.disconnect: " + e.getMessage());
                        }
                }
                return mensaje;
        }

ayuda

amigo yo copie un codigo de esta pagina para subir una carpeta completa por ftp pero el codigo simplemente envia un archivo a la vez aqui les dejo el codigo esperando me puedan ayudar

package nuevoftp;

import java.io.BufferedInputStream;
import java.io.File;
//import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import javax.swing.JOptionPane;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

public class NuevoFtp {

public static void main(String[] args) throws SocketException, UnknownHostException, IOException {

try {

FTPClient ftpClient = new FTPClient();
ftpClient.connect(InetAddress.getByName(""));
ftpClient.login("", "");

//Verificar conexión con el servidor.
int reply = ftpClient.getReplyCode();

System.out.println("Respuesta recibida de conexión FTP:" + reply);

if (FTPReply.isPositiveCompletion(reply)) {
System.out.println("Conectado Satisfactoriamente");
} else {
System.out.println("Imposible conectarse al servidor");
}

//Verificar si se cambia de direcotirio de trabajo
ftpClient.changeWorkingDirectory("/");//Cambiar directorio de trabajo
System.out.println("Se cambió satisfactoriamente el directorio");

//Activar que se envie cualquier tipo de archivo
ftpClient.changeWorkingDirectory("");
//ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
BufferedInputStream enviar = null;
enviar = new BufferedInputStream(new FileInputStream(""));
ftpClient.enterLocalPassiveMode();
ftpClient.storeFile("", enviar);
JOptionPane.showMessageDialog(null, "Se enviaron los archhivos con exito");
enviar.close();
ftpClient.logout();
ftpClient.disconnect();

} catch (Exception e) {
System.out.println(e.getMessage());
JOptionPane.showMessageDialog(null, "Algo malo sucedió favor de checar \n su internet si se encuentra bien reportar a kflow");
}
}

}