下载需要的两个包
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的这个属性可以根据操作系统来选择分隔符。可以适应各种操作系统。嘿嘿。
Apache的fileupload上传文件
最新推荐文章于 2025-04-10 11:55:34 发布