1

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

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

4

2 回答 2

2

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

但是,网络浏览器是 HTTP 客户端,而不是 FTP 客户端。这是网络浏览器的自然功能设计限制。JSF 看起来像个魔术师,但在这里它真的无能为力。它仅拦截 HTTP 请求/响应。

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

于 2012-09-20T12:20:22.687 回答
0

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

下面是一个例子;

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;
    }
  }
}

在您的托管bean/控制器中;

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" />
于 2012-10-01T11:46:21.830 回答