首先,要明确一点。即,通过formdata形式上传表单和文件的方式,每一个表单必须有name属性,否则无法获得参数,此处要注意input表单是file的,只需要一个name,并且后台不要用某个成员变量去接值,否则报错一般是405;
第二,笔者项目前端请求采用的是ajax,必须在此处请求处加上两个属性。分别是:processData : false和contentType : false。若没有这两个属性,会造成乱码、异常等现象;无法获取各参数;
/**
* 上传文件(可供Action/Controller层使用)
*
* @param hostname
* FTP服务器地址
* @param port
* FTP服务器端口号
* @param username
* FTP登录帐号
* @param password
* FTP登录密码
* @param pathname
* FTP服务器保存目录
* @param fileName
* 上传到FTP服务器后的文件名称
* @param inputStream
* 输入文件流
* @return
*/
public static boolean uploadFile(String hostname, int port, String username, String password, String pathname,
String fileName, MultipartFile inputStream) {
boolean flag = false;
FTPClient ftpClient = new FTPClient();
ftpClient.setControlEncoding("UTF-8");// 设置编码
try {
ftpClient.connect(hostname, port);// 连接FTP服务器
ftpClient.login(username, password);// 登录FTP服务器
int replyCode = ftpClient.getReplyCode();// 是否成功登录FTP服务器
if (!FTPReply.isPositiveCompletion(replyCode)) {
return flag;
}
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);// 文件类型设为二进制文件
ftpClient.makeDirectory(pathname);
ftpClient.changeWorkingDirectory(pathname);// 切换工作路径
InputStream in = inputStream.getInputStream();
ftpClient.storeFile(fileName, in);// 开始上传
in.close();
ftpClient.logout();
flag = true;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return flag;
}
2.2 上传主方法
/**
* @description fromData传参的FTP上传方式,可以适用本方法
* @history_version 1.0
* @param request 页面传进来的请求
* @return 存储的(绝对)路径
*/
public static String uploadFile(HttpServletRequest request){
CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver(request.getSession().getServletContext());
int tempi=0;
String imgUrl="";
if(multipartResolver.isMultipart(request)){
MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest) request;
Iterator
while(iter.hasNext()){
MultipartFile file=multiRequest.getFile(iter.next());
if(!file.isEmpty()){
tempi++;
String imgName=file.getOriginalFilename();
String imgType = imgName.substring(imgName.lastIndexOf("."));
String filename = tempi +StringUtil.getOrderNum("") + imgType;
String ftpIp = ParamSettingUtil.getFtpIp();
int ftpport = ParamSettingUtil.getFtpport();
String username = ParamSettingUtil.getFtpusername();
String password = ParamSettingUtil.getFtppassword();
String serviceUrl = ParamSettingUtil.getServiceurl();
String imgRootPath = ParamSettingUtil.getPayImgPath();
String imgPath = imgRootPath;
uploadFile(ftpIp, ftpport, username, password, imgPath, filename, file);
imgUrl=imgUrl+serviceUrl+imgPath+filename+",";
}
}
if(imgUrl.length()>2){
return imgUrl.substring(0,imgUrl.length()-1);
}
}
return null;
}
后台接受参数的形式如下:
@RequestMapping(value="/saveOpenCountInfo")
@ResponseBody
public Tidings