- 浏览: 2494072 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
nation:
你好,在部署Mesos+Spark的运行环境时,出现一个现象, ...
Spark(4)Deal with Mesos -
sillycat:
AMAZON Relatedhttps://www.godad ...
AMAZON API Gateway(2)Client Side SSL with NGINX -
sillycat:
sudo usermod -aG docker ec2-use ...
Docker and VirtualBox(1)Set up Shared Disk for Virtual Box -
sillycat:
Every Half an Hour30 * * * * /u ...
Build Home NAS(3)Data Redundancy -
sillycat:
3 List the Cron Job I Have>c ...
Build Home NAS(3)Data Redundancy
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的这个属性可以根据操作系统来选择分隔符。可以适应各种操作系统。嘿嘿。
下载需要的两个包
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的这个属性可以根据操作系统来选择分隔符。可以适应各种操作系统。嘿嘿。
发表评论
-
Update Site will come soon
2021-06-02 04:10 1619I am still keep notes my tech n ... -
Portainer 2020(4)Deploy Nginx and Others
2020-03-20 12:06 383Portainer 2020(4)Deploy Nginx a ... -
Private Registry 2020(1)No auth in registry Nginx AUTH for UI
2020-03-18 00:56 384Private Registry 2020(1)No auth ... -
Docker Compose 2020(1)Installation and Basic
2020-03-15 08:10 339Docker Compose 2020(1)Installat ... -
VPN Server 2020(2)Docker on CentOS in Ubuntu
2020-03-02 08:04 407VPN Server 2020(2)Docker on Cen ... -
Nginx Deal with OPTIONS in HTTP Protocol
2020-02-15 01:33 307Nginx Deal with OPTIONS in HTTP ... -
PDF to HTML 2020(1)pdftohtml Linux tool or PDFBox
2020-01-29 07:37 350PDF to HTML 2020(1)pdftohtml Li ... -
Elasticsearch Cluster 2019(2)Kibana Issue or Upgrade
2020-01-12 03:25 607Elasticsearch Cluster 2019(2)Ki ... -
Spark Streaming 2020(1)Investigation
2020-01-08 07:19 236Spark Streaming 2020(1)Investig ... -
Hadoop Docker 2019 Version 3.2.1
2019-12-10 07:39 260Hadoop Docker 2019 Version 3.2. ... -
MongoDB 2019(3)Security and Auth
2019-11-16 06:48 209MongoDB 2019(3)Security and Aut ... -
MongoDB 2019(1)Install 4.2.1 Single and Cluster
2019-11-11 05:07 255MongoDB 2019(1) Follow this ht ... -
Monitor Tool 2019(1)Monit Installation and Usage
2019-10-17 08:22 292Monitor Tool 2019(1)Monit Insta ... -
Ansible 2019(1)Introduction and Installation on Ubuntu and CentOS
2019-10-12 06:15 277Ansible 2019(1)Introduction and ... -
Timezone and Time on All Servers and Docker Containers
2019-10-10 11:18 298Timezone and Time on All Server ... -
Kafka Cluster 2019(6) 3 Nodes Cluster on CentOS7
2019-10-05 23:28 242Kafka Cluster 2019(6) 3 Nodes C ... -
K8S Helm(1)Understand YAML and Kubectl Pod and Deployment
2019-10-01 01:21 292K8S Helm(1)Understand YAML and ... -
Rancher and k8s 2019(5)Private Registry
2019-09-27 03:25 330Rancher and k8s 2019(5)Private ... -
Jenkins 2019 Cluster(1)Version 2.194
2019-09-12 02:53 411Jenkins 2019 Cluster(1)Version ... -
Redis Cluster 2019(3)Redis Cluster on CentOS
2019-08-17 04:07 340Redis Cluster 2019(3)Redis Clus ...
相关推荐
Apache FileUpload文件上传组件API解析
apache fileupload 处理文件上传(流式和非流式)临时文件处理
jQuery Uploadify + Apache Fileupload异步上传文件示例
apache commons.fileupload上传组件在上传文件时,在调用parseRequest方法时,先将输入流上传到服务器临时目录,在之后的文件处理过程中,再将临时目录下保存的文件复制到指定的目录,多了一道转储步骤。本实现抽取...
非常详细非常好的例子。
//检查当前项目是普通表单项目还是上传文件。 if (item.isFormField()) {//如果是普通表单项目,显示表单内容。 String fieldName = item.getFieldName(); if (fieldName.equals("name")) //对应demo1.html中...
http://blog.csdn.net/alanchen520/article/details/34409913
抽取了apache commons.fileupload的最基本代码,组合成一个简单的文件上传组件
Apache_Commons_fileUpload实现文件上传Apache_Commons_fileUpload实现文件上传
NULL 博文链接:https://java110eye.iteye.com/blog/1111320
apache.commons.fileupload上传实例 java文件上传
NULL 博文链接:https://weideming.iteye.com/blog/1229692
Apache组织提供的一个开源组件Commons-FileUpload,该组件可以方便的将“multipart/form-data”类型请求中的各种表单域解析出来,并实现一个或多个文件的上传,同时也可以限制上传文件的大小等内容。其性能十分优异,...
java_文件上传组件_Apache_Commons_FileUpload_应用指南
主要为大家分享了Apache Commons fileUpload文件上传4个示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
org.apache.commons-fileupload-1.2.1.jar及上传文件的Demo
采用了Ajax技术 功能: 文件上传 特点: 动态显示进度, 百分比, (中文)文件名, 文件长度, 上传速度......说明:累计上传文件不超过10M(可以更改代码调整),当超过1M时可以看到进度条。请下载这个较新版本。