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!
    文件你应该知道怎么获取了,既然二进制文件已经拿到了,下一步就是上传了.
    相信你一定了解!

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

报告相同问题?

悬赏问题

  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集