设为首页 收藏本站
查看: 1316|回复: 0

[经验分享] 文件传输之文件上传ftp

[复制链接]

尚未签到

发表于 2016-6-9 12:24:43 | 显示全部楼层 |阅读模式
  项目运用的struts和spring框架,需要做一个通用的文件上传,文件下载,文件导出功能供调用,研究了几天,终于写出来了,现在贴出第一部分:文件上传ftp
  文件上传用到的apache的commons.fileupload组件,在前台jsp页面,需要将form表单设置enctype="multipart/form-data",设置这个以后,表单里面的参数要通过if (item.isFormField()) {
                    String fieldId = item.getFieldName();
                    String fieldValue = item.getString("utf-8");
  }这种方式才能获取到,代码如下:
  

@Controller
public class FileTransferController extends BaseController{
//临时文件存放目录
public String tempPath = FileUtil.getProjectPath()+"\\temp\\";
/**
* 文件上传
* @author zheng_liming
* @param request
* @param response
* @return
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
@RequestMapping(value = "/fileTransfer/upload", method = RequestMethod.POST)
public void upload(HttpServletRequest request,HttpServletResponse response) throws Exception{
//获取fileUpload上传组件的items
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload sevletFileUpload = new ServletFileUpload(factory);
List fileItems = null;
//获取表单值,并校验
String ftpPath = "";
Map<String, Object> map = getFormField(factory,sevletFileUpload,request);
if(map.get("success").equals("false")){
super.parseObjectResponse(map);
return;
}else{
ftpPath = map.get("ftpPath").toString();
fileItems = (List) map.get("fileItems");
}
//消息Map
Map<String, Object> resultMap  = new HashMap<String, Object>();
Map<String, Object> msgMap  = new HashMap<String, Object>();
boolean res = false;
//临时文件夹如果不存在,则新建
File tempFile = new File(tempPath);
if (!tempFile.exists()) {
tempFile.mkdir();
}
List fileInfo  = new ArrayList();//存放所有的文件信息返回给前台
//依次处理每个上传的文件
Iterator iter = fileItems.iterator();
while (iter.hasNext()) {
Map<String, Object> tempMap  = new HashMap<String, Object>();//每个文件上传成功后,存放文件的信息
FileItem item = (FileItem) iter.next();
if (!item.isFormField()) {// 忽略其他不是文件域的所有表单信息
String name = item.getName();
long size = item.getSize();
if ((name == null || name.equals("")) && size == 0)
continue;
//将文件写入临时文件
name = name.replaceAll("\\\\", "/");
name = name.substring(name.lastIndexOf("/")+1);
String filePath = tempPath+name;
File file = new File(filePath);
if (!file.exists()) {
file.createNewFile();
}
item.write(file);
//连接ftp
FtpClient ftpClient = FtpUtil.connectServer(ftpPath);
//文件上传
boolean uploadResult = FileUtil.ftpUpload(ftpClient,name,filePath);
//关闭ftp连接
FtpUtil.closeConnect(ftpClient);
if(uploadResult){
tempMap.put("fileName",name);
tempMap.put("fileSize",size);
tempMap.put("filePath",ftpPath);
fileInfo.add(tempMap);
res = true;
}else{
res = false;
break;
}
}
}
msgMap.put("msg", res?"上传成功!":"上传失败!");
resultMap.put("msg", msgMap);
resultMap.put("success", res?"true":"false");
resultMap.put("fileInfo", fileInfo);
//所有操作完成后删除临时文件及文件夹
FileUtil.removeAllFile(tempPath);
FileUtil.removeFolder(tempPath);
//返回是否成功的消息与文件信息
super.parseObjectResponse(resultMap);
}
/**
* 获取上传时的表单参数并校验
* @author zheng_liming
* @param factory
* @param sevletFileUpload
* @param request
* @return
*/
@SuppressWarnings("rawtypes")
public Map<String, Object> getFormField(DiskFileItemFactory factory,ServletFileUpload sevletFileUpload,HttpServletRequest request) throws Exception{
//返回校验的消息
Map<String, Object> result  = new HashMap<String, Object>();
Map<String, Object> msg  = new HashMap<String, Object>();
//判断表单是否设置enctype="multipart/form-data"
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart == true) {
String fileSizeMax = null;
String[] allowFileType = null;
String[] forbidFileType = null;
String filePath = null;
List fileItems = sevletFileUpload.parseRequest(request);
//获取表单的值
Iterator formFielditer = fileItems.iterator();
while (formFielditer.hasNext()) {
FileItem item = (FileItem) formFielditer.next();
if (item.isFormField()) {
String fieldId = item.getFieldName();
String fieldValue = item.getString("utf-8");
fieldId = new String(fieldId.getBytes(),"utf-8");
fieldValue = new String(fieldValue.getBytes(),"utf-8");
if(fieldId.equalsIgnoreCase("fileSizeMax")){
fileSizeMax = fieldValue;
}else if(fieldId.equalsIgnoreCase("allowFileType")){
allowFileType = fieldValue.split(",");
}else if(fieldId.equalsIgnoreCase("forbidFileType")){
forbidFileType = fieldValue.split(",");
}else if(fieldId.equalsIgnoreCase("filePath")){
filePath = fieldValue;
}
}
}
//设置允许用户上传文件大小,单位:字节
if(fileSizeMax!=null){
sevletFileUpload.setSizeMax(Long.parseLong(fileSizeMax));
try {
sevletFileUpload.parseRequest(request);
} catch (FileUploadException e) {
result.put("success", "false");
msg.put("msg", "文件大小超过限制!");
result.put("msg", msg);
return result;
}
}
boolean validate = true;
Iterator tempiter = fileItems.iterator();
//校验文件是否为允许上传的格式
if(allowFileType!=null&&allowFileType.length>0){
int count = 0;//通过校验的文件数
int size = 0;//总共的文件数
while (tempiter.hasNext()) {
FileItem item = (FileItem) tempiter.next();
if (!item.isFormField()) {
String name = item.getName();
if (name != null && !name.equals("") && item.getSize() != 0)
size = size+1;
for(int i=0;i<allowFileType.length;i++){
if(name.substring(name.lastIndexOf(".")).equals(allowFileType)){
count = count +1;
break;
}
}
}
}
validate = count==size?true:false;
}else{
//校验文件是否为禁止上传的格式
if(forbidFileType!=null&&forbidFileType.length>0){
while (tempiter.hasNext()&&validate) {
FileItem item = (FileItem) tempiter.next();
if (!item.isFormField()) {
String name = item.getName();
if ((name == null || name.equals("")) && item.getSize() == 0)
continue;
for(int i=0;i<forbidFileType.length;i++){
if(name.substring(name.lastIndexOf(".")).equals(forbidFileType)){
validate = false;
break;
}
}
}
}
}
}
if(!validate){
result.put("success", "false");
msg.put("msg", "有禁止上传的文件格式!");
result.put("msg", msg);
return result;
}
//设置最多只允许在内存中存储的数据,单位:字节
factory.setSizeThreshold(4096);
//设置一旦文件大小超过内存中存储的大小时数据存放在硬盘的目录
File tempFile = new File(tempPath);
if (!tempFile.exists()) {
tempFile.mkdir();
}
factory.setRepository(tempFile);
result.put("success", "true");
result.put("ftpPath", filePath);
result.put("fileItems", fileItems);
return result;
} else {
result.put("success", "false");
msg.put("msg", "enctype必须为:multipart/form-data");
result.put("msg", msg);
return result;
}
}
}
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-228250-1-1.html 上篇帖子: Configuring Permissions for FTP and Apache 下篇帖子: JAVA 中FTP客户端连接服务器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表