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

[经验分享] Apache的fileupload上传文件

[复制链接]

尚未签到

发表于 2017-1-2 11:11:28 | 显示全部楼层 |阅读模式
Apache的fileupload上传文件

下载需要的两个包
common-fileupload
http://commons.apache.org/fileupload/
下载得到
commons-fileupload-1.2.1.jar

common-io
http://commons.apache.org/io/
下载得到
commons-io-1.4.jar

由于我是使用的比较老版本的Struts。所以还遇到了些问题。

1、页面修改
先修改页面的FORM,首先在FORM中加入enctype="multipart/form-data"
<form name="applyForm" method="post" action="shareIPC.do?method=share" enctype="multipart/form-data">
同时在表单中增加type=file的元素
<input name="uploadFile" type="file"/>

2、struts-config.xml的配置文件修改
去掉了原来ACTION上面的ACTIONFORM配置
<action path="/shareIPC"
type="com.megaeyes.web.action.ShareIPCAction" scope="request"
    parameter="method" >
<forward name="shareApply"
   path="/pages/device/shareIPC_new.jsp" />
</action>
去掉了parameter="method" 后面紧跟的name="VideoShowForm"

3、ACTION层代码的变动
由于加入了multipart/form-data标记,所以从request里面传递进来的其他参数死活拿不到。
所以自己从fileUpload里面的fileItems里面一个一个来取
写在ActionBase里面的基类方法
方法一,取到所有传递的参数的items
public List getFileItems(HttpServletRequest request) {
List fileItems = null;
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(4096);
// maximum size that will be stored in memory
// the location for saving data that is larger than getSizeThreshold()
FileUploadManager fileUploadManager = (FileUploadManager) getBean("fileUploadManager");
if (StringUtil.isNotBlank(fileUploadManager.getFileUploadTemp())) {
   // 设置临时文件的存放目录D:\\repository,或者可以不设置,不设置应该是系统默认的一个目录
   //该目录必须已经存在
   factory.setRepository(new File(fileUploadManager
     .getFileUploadTemp()));
}

ServletFileUpload upload = new ServletFileUpload(factory);
// maximum size before a FileUploadException will be thrown
//上传文件的最大大小2,000,000,单位应该是byte,这里是2M
upload.setSizeMax(new Long(fileUploadManager.getFileUploadMax())
    .longValue());
upload.setHeaderEncoding("UTF-8");
try {
   fileItems = upload.parseRequest(request);
} catch (FileUploadException e) {
   e.printStackTrace();
}
return fileItems;
}

方法二,从拿到的很多items中,得到对应的某个文本内容的值
public String getStringValue(HttpServletRequest request, String fieldName,
   List fileItems) {
String fieldValue = "";
if (fileItems == null || fileItems.isEmpty()) {
   return fieldValue;
}
Iterator iter = fileItems.iterator();
while (iter.hasNext()) {
   FileItem item = (FileItem) iter.next();
   if (item.isFormField()) {
    if (fieldName.equalsIgnoreCase(item.getFieldName())) {
     try {
      fieldValue = item.getString("UTF-8");
     } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
     }
    }
   }
}
return fieldValue;
}

方法三,从拿到的所有items中,得到对应的type=file的二进制的内容
public DiskFileItem getFileItem(HttpServletRequest request,
    String itemName, List fileItems) {
   DiskFileItem fileItem = null;
   Iterator iter = fileItems.iterator();
   while (iter.hasNext()) {
    fileItem = (DiskFileItem) iter.next();
    if (fileItem.isFormField()) {
   } else {
    String name = fileItem.getFieldName();
    long size = fileItem.getSize();
    if (StringUtil.isBlank(name)
      || !itemName.equalsIgnoreCase(name) || size == 0) {
     continue;
    } else {
     break;
    }
   }
}
return fileItem;
}


在ACTION中直接调用底层的ACTION基类
//得到所有的items
List items = this.getFileItems(request);
if (items != null && !items.isEmpty()) {
//得到一般的参数cityname
vsForm.setCityname(this.getStringValue(request, "cityname", items));
//得到二进制的参数uploadFile
DiskFileItem fileItem = this.getFileItem(request, "uploadFile", items);
if(fileItem != null){
    FileUploadManager fileUploadManager = (FileUploadManager)getBean("fileUploadManager");
    UserVO user = getCurrentUser(request);
    String fileName = fileUploadManager.uploadFile(fileItem, user.getId(),vsForm.getVideoInputChannelId());
   //传递二进制的item,用户名,文件名,调用fileUploadManager来完成上传文件
}
}


3、manager层新增的FileUploadManagerImpl.java:

package com.megaeyes.ipcamera.service.impl;

import java.io.File;

import org.apache.commons.fileupload.disk.DiskFileItem;

import com.megaeyes.ipcamera.service.iface.FileUploadManager;
import com.megaeyes.ipcamera.service.util.StringUtil;

public class FileUploadManagerImpl extends BaseManager implements
   FileUploadManager {

public static final String FILE_UPLOAD_PATH = "D:\\\\upload";

//public static final String FILE_UPLOAD_TEMP = "D:\\\\repository";

public static final String FILE_UPLOAD_MAX = "2000000";

private String fileUploadTemp;

private String fileUploadPath;

private String fileUploadMax;

/**
* 上传文件
*         fileItem fileUpload的二进制item
*     userId    用户ID当路径名
*          文件名用上传的名字
*/
public String uploadFile(DiskFileItem fileItem, String userId) {
   String fileName = "";
   String path = "";
   if (fileItem != null && StringUtil.isNotBlank(userId)) {
    try {
     path = this.getFileUploadPath() + "\\" + userId;
     fileName = path + "\\" + getFileName(fileItem.getName());
     File f = new File(path);
     // 先生成目录
     if (!f.exists()) {
      f.mkdir();
     }
     if (f.exists()) {
      // 目录存在开始拷贝文件
      fileItem.write(new File(fileName));
     }
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
   return fileName;
}

/**
* 上传文件
*     fileItem fileUpload的二进制文件
*        userId    用户ID当路径名
*        fileName 文件名字
*        返回 文件路径
*/
public String uploadFile(DiskFileItem fileItem, String userId,
    String fileName) {
   String fullName = "";
   String path = "";
   if (fileItem != null && StringUtil.isNotBlank(userId)) {
    try {
     path = this.getFileUploadPath() + "\\" + userId;
     fullName = path + "\\" + fileName
       + getFileTailName(fileItem.getName());
     File f = new File(path);
     if (!f.exists()) {
      f.mkdir();
     }
     if (f.exists()) {
      fileItem.write(new File(fullName));
     }
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
   return fullName;
}

//取得文件后缀名
private String getFileTailName(String fullName) {
   String tailName = "";
   if (StringUtil.isBlank(fullName)) {
    return tailName;
   }
   int begin = fullName.lastIndexOf(".");
   tailName = fullName.substring(begin, fullName.length());
   return tailName;
}

//取得文件名字
private String getFileName(String fullName) {
   String fileName = "";
   if (StringUtil.isBlank(fullName)) {
    return fileName;
   }
   int begin = fullName.lastIndexOf("\\");
   fileName = fullName.substring(begin + 1, fullName.length());
   return fileName;
}

public String getFileUploadTemp() {
   return fileUploadTemp;
}

public void setFileUploadTemp(String fileUploadTemp) {
   this.fileUploadTemp = fileUploadTemp;
}

public String getFileUploadPath() {
   if (StringUtil.isBlank(fileUploadPath)) {
    return FILE_UPLOAD_PATH;
   }
   return fileUploadPath;
}

public void setFileUploadPath(String fileUploadPath) {
   this.fileUploadPath = fileUploadPath;
}

public String getFileUploadMax() {
   if (StringUtil.isBlank(fileUploadMax)) {
    return FILE_UPLOAD_MAX;
   }
   return fileUploadMax;
}

public void setFileUploadMax(String fileUploadMax) {
   this.fileUploadMax = fileUploadMax;
}

public static void main(String[] args) {
   FileUploadManagerImpl impl = new FileUploadManagerImpl();
   String s = "c:\\\\test.jpg";
   String test = impl.getFileName(s);
   System.out.println(test);
}

}


该程序在WINDOWS上测试通过,但是到linux上之后发现这个"\\"是不正确的,所以经过同事的指点

将这个符号全部修改成了

private final static String FILE_SEPARATOR=File.separator;

FILE的这个属性可以根据操作系统来选择分隔符。可以适应各种操作系统。嘿嘿。

运维网声明 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-322812-1-1.html 上篇帖子: Apache DBCP 连接池 下篇帖子: org.apache.commons.digester 学习
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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