iteye_324 2010-07-27 11:12
浏览 174
已采纳

jsp实现ftp上传,客户端不能上传

我用jsp实现ftp上传功能,但是客户端不能往服务器端传上传文件,服务器端自己可以上传文件,代码如下:

package com.syh.struts.action;

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

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

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

public class MainCtrlAction extends Action {
private FtpClient ftpClient;

public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
try {
request.setCharacterEncoding("gbk");
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
response.setCharacterEncoding("gbk");
try {
//连接ftp服务器
connectServer("127.0.0.1", "admin", "for720314","aa");
//上传文件;并返回上传文件的信息
request.setAttribute("inf", upload(request.getParameter("file")));
} catch (Exception e) {
System.out.println(e.toString());
request.setAttribute("inf", e.toString());
//request.getRequestDispatcher("view_inf.jsp").forward(request, response);

} finally {
if (ftpClient != null) {
try {
ftpClient.closeServer();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//request.getRequestDispatcher("view_inf.jsp").forward(request, response);

return mapping.findForward("cg");
}

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上传后的新文件名
String fn=filename.substring(filename.lastIndexOf("\")+1);
os = ftpClient.put(fn);
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 "上传文件成功!";
}
}
那位大侠给解决一下

  • 写回答

1条回答 默认 最新

  • chengjf0526 2010-07-28 13:13
    关注

    这个问题出现在你使用"request.getParameter("file")"获取到的文件路径,说白了就是一个字符串.
    想通过它来构造IO留来获取文件是行不通的,你一定会发现,系统找不到指定的文件,除非服务器和客户端在同一台机器上.
    那这个问题需要如何解决呢?
    1.设置页面form属性:method="POST" enctype="multipart/form-data"
    2.此时会遇到一个问题,页面上其他控件的值无法使用原来的方法request.getParameter("name")获取了.
    3.可以参看这段代码,是我以前写的一段代码:
    [code="java"]Map fieldMap = new HashMap();
    // 处理文件上传
    Map fileMap = new HashMap();
    {
    RequestContext requestContext = new ServletRequestContext(request);
    if (FileUpload.isMultipartContent(requestContext)) {
    DiskFileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload servletFileUpload = new ServletFileUpload(
    factory);
    // 设置上传附件不能大于2k
    servletFileUpload.setSizeMax(2000000);
    try {
    List list = servletFileUpload
    .parseRequest(request);
    for (Iterator listIt = list.iterator(); listIt
    .hasNext();) {
    FileItem fileItem = listIt.next();
    String name = fileItem.getName();
    // 排除其他控件值以及空文件
    if (null != name && !"".equals(name)) {
    byte[] byteFile = fileItem.get();
    fileMap.put(fileItem.getName(), byteFile);
    } else if (null == name) {
    putFormField(fieldMap, fileItem.getFieldName(),
    fileItem.getString("UTF-8"));
    }
    }
    } catch (FileUploadException e) {
    e.printStackTrace();
    }
    }
    }
    ServletContext application = getApplication(request);
    String ip = (String) application.getAttribute(Constants.IP);
    String port = (String) application.getAttribute(Constants.PORT);
    manager = new MmsManager(ip, port);
    String result = manager.sendMessage(fieldMap, fileMap);
    System.out.println(result);[/code]
    4.注意fileItem并不是指文件,而是任意页面控件信息,包括文件.
    OK!
    文件你应该知道怎么获取了,既然二进制文件已经拿到了,下一步就是上传了.
    相信你一定了解!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 Python安装cvxpy库出问题
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥15 python天天向上类似问题,但没有清零
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?