我想在我的JSF应用程序中使用org.apache.commons.net.ftp.FTPClient
。客户端(Web浏览器)如何上传到我的Web应用程序服务器以获取大文件。即使我使用RichFaces File Upload
或PrimeFaces File Upload
,客户端浏览器也可以使用HTTP Protocol
。如何支持FTP Protocol
到客户端浏览器?你能提供更好的方式吗?
原因:应用程序用户无法直接访问我们的Repository Server(SVN)
。首先,他们必须在Web AS
上将文件上传到我们的应用程序。然后,应用checkin/chekout
到RepositoryServer
。应用程序用户至少可以上传500M到2G的文件。这就是为什么,我在想,如何支持FTP Protocol
浏览器客户端更快。否则,我错了吗?
答案 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" />