项目运用的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[i])){ 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[i])){ 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; } } }
相关推荐
Labview FTP上传文件。
基于openssl的ftp文件传输系统源码基于openssl的ftp文件传输系统源码基于openssl的ftp文件传输系统源码基于openssl的ftp文件传输系统源码基于openssl的ftp文件传输系统源码基于openssl的ftp文件传输系统源码基于...
由于自己最近项目做到大文件传输,最大支持5个G的文件传输,并且每天定时传输文件,基于此需求自己开发的一个完整项目,现在分享给需要的朋友。支持定时传输,文件分割合并,断点续传,aes加密解密,md5文件校验完整...
在ubuntu linux下实现的FTP文件上传,程序自动监听目录下是否有图片文件,有文件则自动通过FTP上传到服务器端,同时删除目录下的文件,实现了批量文件上传,自动重命名文件,程序经测试,运行稳定。
使用前端插件上传文件到ftp服务器,上传配置灵活,通过配置文件即可配置文件类型大小,还有ftp服务器连接信息
通过Wireshark抓取数据包分析ftp文件传输双方的通讯过程
WS_FTP Pro,一款功能强大的ftp文件传输工具,采用灵活的传输协议,主要用于文件的上传、下载、浏览和管理等操作 ABB机器人文件传输软件,传输文件通过FTP,SSL,SSH和HTTP / S的传输协议。
本文给大家介绍jwt登录认证及鉴权的流程,对springboot ftp上传文件到远程服务器的相关知识感兴趣的朋友一起看看吧
Linux ftp 实现文件传输,客户端,服务器端实现文件上传下载
主要介绍了springboot以FTP方式上传文件到远程服务器,需要的朋友可以参考下
C语言实现的ftp 文件传输协议,包括文件上传 ,文件下载,查看目录 等功能,
文件传输协议(File Transfer Protocol, FTP)是重要的应用层协议,用于Internet上控制文件的双向传输。FTP允许用户连接一台远程计算机,查看该计算机上的文件,复制文件至本地计算机以及从本地计算机上传文件至该...
ftp文件上传jar文件,有需要的同志可以看一下
java实现ftp断点续传,上传文件到FTP服务器,支持断点续传,同时支持LINUX主机,代码里面包括了比较多的java网络操作类,比如连接FTP的常规类、递归创建远程服务器目录 上传文件到服务器,新上传和断点续传操作,远程...
java大文件上传至ftp服务器带进度条显示的,进度条的显示和ftp的上传速度同步,解决了进度条显示和ftp不同步的问题
连接FTP服务器,实现文件的上传,删除功能,可以断点续传,支持退出重进App续传,断网重连续传。
基于FTP的超大文件上传控件及原代码,可以解决1G以上文件上传问题,并支持断点续传
1、个人原创作品; 2、C语言实现ftp文件传输功能,可上传/下载文件; 3、已经在虚拟机+ubuntu16.04上编译通过,并验证OK; 4、4K随机数据收发进行压力测试,用于通讯稳定性验证;
FTP多线程切割文件传输,
说明:本程序主要是实现ftp上传功能, 启动前读取配置文件ftp_upload.ini. */ func main() { // 读取配置文件 iniConfig := new(util.Config) iniConfig.InitConfig("./ftp_upload.ini") host := iniConfig.Read...