`
jacally
  • 浏览: 760545 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java实现的ftp文件上传例题

    博客分类:
  • JAVA
阅读更多


作者:怀念霍去病 文章来源:http://publishblog.blogchina.com/blog/tb.b?diaryID=5075985 上传日期:2006-10-03

 
前几天写过一编"关于java的http协议文件上传实用例题"的文章;今天还想写编关于java用ftp上传文件的内容。我来说说2者的优缺点;
1:用http协议上传更适合web编程的方便;传小于1M文件速度要比用ftp协议上传文件略快。安全性好;不像ftp那样;必须要启动一个ftp服务才行。

2:用ftp协议上传文件大于1M的文件速度比http快;文件越大;上传的速度就比http上传快的倍数越大。而且用java编写程序;ftp比http方便。好,废话少说;我们先搭建一个实例来理性认识一下用java编写ftp上传文件的技术。

首先在本机启动一个ftp服务,ftp的用户:"IUSR_ZJH" 密码:"123";随后在ftp主目录下建一个名为upftp的子目录;下面有4个文件就可启动这个例题了。

文件1:MainCtrl.java(servlet文件)内容如下:

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;

import java.io.FileInputStream;
import java.io.IOException;

import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;


public class MainCtrl extends HttpServlet {

private FtpClient ftpClient;

public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {

resp.setContentType("text/html; charset=UTF-8");

try {
//连接ftp服务器
connectServer("127.0.0.1", "IUSR_ZJH", "123", "upftp");
//上传文件;并返回上传文件的信息
req.setAttribute("inf", upload(req.getParameter("file_name")));
} catch (Exception e) {
System.out.println(e.toString());
req.setAttribute("inf", e.toString());
req.getRequestDispatcher("view_inf.jsp").forward(req, resp);
return;
} finally {
if (ftpClient != null) {
ftpClient.closeServer();
}
}
req.getRequestDispatcher("view_inf.jsp").forward(req, resp);
}

public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
//连接ftp服务器
private void connectServer(String server, String user, String password,
String path) throws IOException {
// server:FTP服务器的IP地址;user:登录FTP服务器的用户名
// password:登录FTP服务器的用户名的口令;path:FTP服务器上的路径
ftpClient = new FtpClient();
ftpClient.openServer(server);
ftpClient.login(user, password);
//path是ftp服务下主目录的子目录
if (path.length() != 0)
ftpClient.cd(path);
//用2进制上传
ftpClient.binary();
}

//上传文件;并返回上传文件的信息
private String upload(String filename) throws Exception {
TelnetOutputStream os = null;
FileInputStream is = null;
try {
//"upftpfile"用ftp上传后的新文件名
os = ftpClient.put("upftpfile");
java.io.File file_in = new java.io.File(filename);
if (file_in.length()==0) {
return "上传文件为空!";
}
is = new FileInputStream(file_in);
byte[] bytes = new byte[1024];
int c;
while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c);
}
} finally {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
}
return "上传文件成功!";
}

}

文件2:upftp.htm(前台操作页面)内容如下:

<html><body> <form method="post" action="/upftp/MainCtrl"> <!-- C:\\Downloads\\setup_kubao.exe客户端真实文件路径 --> <input type="text" name="file_name" size="38" value="C:\\Downloads\\setup_kubao.exe" /> <input type="submit" /> </form></body> </html></body></html></HTML>

分享到:
评论
4 楼 bobor_2008 2010-07-08  
单用上面的页面去上传到FTP服务器上在项目部署本机当然是可以了,但其它的访问者就不可以了,因为路径的问题。真正的实现各客户端都可以上传到FTP服务器上要通过第三方组件把本地文件上传到服务器上,然后再服务器上传到目标FTP服务器上。

如果目标服务器和FTP服务器是同一台的话,这样就感觉有点线圈子。

支持LZ的共享。
3 楼 kwj 2008-07-02  
楼上问的好。
但服务器和客户端分开的时候,上传了就出现问题了。

郁闷。。
2 楼 jacally 2008-02-23  
客户端上传文件到服务器是通过文件流的方式上传到服务器端,客户端文件上传控件应该是<input type="file" name="file_name" value="C:\\Downloads\\setup_kubao.exe" />,这里可能是原文作者的笔误。
我参考该文档主要是借鉴了一下FTP组件的应用。
关于文件上传的功能实现一些MVC框架有完整的解决实例,比如Struct、webwork等,可以参考一下。
1 楼 octopusyu 2008-02-22  
你这样不行吧?
你的upftp.htm页面中传递的file_name是客户端的文件绝对路径,而你servlet是在服务器端执行的程序,当服务器和客户端不在同一台机器上的时候,怎么可以根据file_name而获取客户端的物理文件来执行ftp上传呢?
等待回答ing.....

相关推荐

Global site tag (gtag.js) - Google Analytics