`
sillycat
  • 浏览: 2487706 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Apache的fileupload上传文件

    博客分类:
  • JAVA
阅读更多
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的这个属性可以根据操作系统来选择分隔符。可以适应各种操作系统。嘿嘿。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics