如何在JSF中使用FTP文件上传?

时间:2012-09-20 06:00:04

标签: java jsf file-upload ftp

我想在我的JSF应用程序中使用org.apache.commons.net.ftp.FTPClient。客户端(Web浏览器)如何上传到我的Web应用程序服务器以获取大文件。即使我使用RichFaces File UploadPrimeFaces File Upload,客户端浏览器也可以使用HTTP Protocol。如何支持FTP Protocol到客户端浏览器?你能提供更好的方式吗?

原因:应用程序用户无法直接访问我们的Repository Server(SVN)。首先,他们必须在Web AS上将文件上传到我们的应用程序。然后,应用checkin/chekoutRepositoryServer。应用程序用户至少可以上传500M到2G的文件。这就是为什么,我在想,如何支持FTP Protocol浏览器客户端更快。否则,我错了吗?

2 个答案:

答案 0 :(得分:1)

为了能够将文件发送到FTP服务器,您显然需要一个FTP客户端。

但是,webbrowser是HTTP客户端,而不是FTP客户端。这是webbrowser的自然功能设计限制。 JSF看起来像一个魔术师,但在这里它真的无法为你做任何事情。它仅拦截HTTP请求/响应。

确实,你错了。只需坚持以通常的HTTP方式上传文件即可。如果你因为某种原因绝对正面你需要FTP,那么你最好的选择很可能是为这个自制一个Java Applet,但这毕竟是笨拙的。

答案 1 :(得分:0)

首先通过primefaces将HTTP上传到临时目录。然后通过org.apache.commons.net.ftp.FTPClient或通过sun.net.ftp.FtpClient上传到所需的FTP服务器。

以下是一个例子;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import sun.net.ftp.FtpClient;

/**
 *
 * @author fali
 */
public class FtpUtil {

    public String server, username,password, remote, remotedir, local;
    FtpClient ftp;
    public static int BUFFER_SIZE = 10240;
    public FtpUtil(){
        server = "localhost";
        username = "anonymous";
        password = " ";
        remotedir = "/incoming";
        remote = "dvs.txt";
        local = "C:\\dvs.txt";

    }
    protected void putFile() {
    if (local.length() == 0) {
      System.out.println("Please enter file name");
    }
    byte[] buffer = new byte[BUFFER_SIZE];
    try {
      File f = new File(local);
      int size = (int) f.length();
      System.out.println("File " + local + ": " + size + " bytes");
      System.out.println(size);
      FileInputStream in = new FileInputStream(local);
      OutputStream out = ftp.put(remote);

      int counter = 0;
      while (true) {
        int bytes = in.read(buffer);
        if (bytes < 0)
          break;
        out.write(buffer, 0, bytes);
        counter += bytes;
        System.out.println(counter);
      }

      out.close();
      in.close();
    } catch (Exception ex) {
      System.out.println("Error: " + ex.toString());
    }
  }

    public String Upload(){
        String result="";
        try{
        ftp = new FtpClient(server);
        ftp.login(username, password);
        System.out.println(ftp.welcomeMsg);
        ftp.cd(remotedir);
        putFile();
        disconnect();
        }catch(Exception ex){
            System.out.println(ex);
            result = "Error : "+ex;
        }
        return "";
    }
    protected void disconnect() {
    if (ftp != null) {
      try {
        ftp.closeServer();
      } catch (IOException ex) {
      }
      ftp = null;
    }
  }
}

在您的managedbean / controller中;

public String create() {
        System.out.println("Request Button Clicked");
        try {
            // generate reference number
            //current.setReferenceno(genReferenceNo());
            // add to database 
            //getFacade().persist(current);

            // upload to ftp
            FtpUtil fu = new FtpUtil();
            fu.Upload();
            // show reference number

            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("QueueCreated"));
            JsfUtil.addSuccessMessage("Your Reference No. is :" + current.referenceno);
            current = null;
//            try {
//                System.out.println("Redirecting");
//                FacesContext.getCurrentInstance().getExternalContext().dispatch("/");
//            } catch (Exception ex) {
//                System.out.println(ex);
//            }            
            return "";
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
            return null;
        }
    }

在你的页面中有类似的东西;

<br />                    
                <ppctu:commandButton action="#{appointmentController.create}" type="Submit" value="Request" />