如果您对Commons-fileupload1.3.3发布,Java文件上传组件感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于Commons-fileupload1.3.3
如果您对Commons-fileupload 1.3.3 发布,Java 文件上传组件感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于Commons-fileupload 1.3.3 发布,Java 文件上传组件的详细内容,我们还将为您解答java文件上传插件的相关问题,并且为您提供关于
- Commons-fileupload 1.3.3 发布,Java 文件上传组件(java文件上传插件)
文件上传组件 - Apache Commons FileUpload FileItemIterator hasNext()返回false
- apache-commons commons-pool2整合 commons-net 自定 FTPClient对象池
- commons-fileUpload.jar fileUpload.parseRequest (request); 为什么获取不到值
Commons-fileupload 1.3.3 发布,Java 文件上传组件(java文件上传插件)
Commons-fileupload 1.3.3 发布了,Apache Commons FileUpload 组件为 Servlet 和 Web 应用程序提供了一个简单而灵活的方法,为它们添加了多部分文件上传的功能。1.3 版本之后需要 Java 5 或更高版本。
本次更新包括:
FILEUPLOAD-279: DiskFileItem can no longer be deserialized, unless a particular system property is set.
详情请参阅发布说明。
下载地址:
Source code (zip)
Source code (tar.gz)
文件上传组件
前提条件:
1 上传的前提首要条件,在上传的之前需要把form表单的ectype设置成为multipart/form-data
2 使用Apache 的fileupload上传组件,需要用到commons-io-2.0.1-bin的jar包,需要提前引入
fileupload上传组件的流程原理。
1. 每一个提交的request都会别servletfileupload解析, 解析的时候,会先判断,request中是否为包含的上传的内容。servletfileupload需要通过一个 DiskFileItemFactory来初始化设置对象。
2.对于form表单中提交过来的数据, servletFileupload都会将其解析成一个一个的FileItem的项, 可以通过for循环,来遍历每一项。 对于每一项,如果是字段,可以通过isFormField来判断。
并通过getString(“utf-8”)来获取到上传的普通字段中的值。
代码示例:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 判断是否是正确的form格式
boolean isUpload = ServletFileUpload.isMultipartContent(request);
// 文件存储的根目录
String fileStore = getServletContext().getRealPath("/WEB-INF/files");
if (!isUpload) {
response.getWriter().write("不是正确的上传格式");
response.getWriter().write(request.getContentType());
return;
}
// 是正确的上传格式
try {
// 设置临时目录
File tempFile = new File(getServletContext().getRealPath(
"/WEB-INF/temp"));
if (!tempFile.exists()) // 如果临时目录不存在,则创建临时目录
tempFile.mkdir();
DiskFileItemFactory fif = new DiskFileItemFactory();
// 设置临时文件大小。
fif.setSizeThreshold(1024 * 50);
// 设置临时目录
fif.setRepository(tempFile);
ServletFileUpload servletUpload = new ServletFileUpload(fif);
// 设置单个文件上传大小限制500MB
servletUpload.setFileSizeMax(1024 * 1024 * 1024);
// 设置总文件大小限制
servletUpload.setSizeMax(1024*1024*1024);
List<FileItem> filesItem = servletUpload.parseRequest(request);
for (FileItem fileItem : filesItem) {
// 如果上传是普通字段
if (fileItem.isFormField()) {
if(fileItem.getString()==null||fileItem.getString().equals("")){
continue;
//如果字段为空,我就跳过这次循环,不访问了。
}
System.out.println("isFormField");
System.out.println(fileItem.getFieldName() + ":"
+ fileItem.getString("UTF-8"));
} else {
// 如果上传是流是空的没有,东西的话,则文件名称是空的。所以可以直接返回了。
if (fileItem.getName() == null||fileItem.getName().equals("")) {
response.getWriter().write(
("<h1>你还没有给我选择文件就上传,两秒后自动跳回去!<h1>"));
response.setHeader("Refresh", "2;URL=/Upload");
return;
}
// 如果上传的不是视频,鉴别格式的。
// if (!fileItem.getContentType().startsWith("video")) {
// response.getWriter().write(
// ("<h1>你玩我呢?跳回去重新给我上传,两秒后自动跳转!<h1>"));
// response.setHeader("Refresh", "3;URL=/day21Upload");
// return;
// }
InputStream inStream = fileItem.getInputStream();
String fileName = fileItem.getName();
// 截取文件名
fileName = fileName
.substring(fileName.lastIndexOf("\\") + 1);
fileStore = makeStore(fileStore, fileName);
// 改写文件名,确定上传的绝对路径
fileStore = fileStore + "\\" + UUID.randomUUID() + "_"
+ fileName;
OutputStream outStream = new FileOutputStream(new File(
fileStore));
byte b[] = new byte[1024 * 1024];
int len = -1;
while (!((len = inStream.read(b)) == -1)) {
outStream.write(b, 0, len);
}
outStream.flush();
inStream.close();
outStream.close();
fileItem.delete(); // 删除临时文件,一定要在流关闭以后。
response.getWriter().write("正在上传成功,马上跳回主页!");
response.setHeader("Refresh", "2;URL=/Upload");
}
}
} catch (org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException e) {
response.getWriter().write("单个文件大于了500mb请重新选择");
} catch (org.apache.commons.fileupload.InvalidFileNameException e) {
} catch (Exception e) {
// TODO Auto-generated catch block
response.getWriter().write("反正是不想给你上传,你打我啊啊?! ");
System.out.println(e.getMessage());
e.printStackTrace();
}
}
Apache Commons FileUpload FileItemIterator hasNext()返回false
我正在使用apache commons fileupload流api。但是FileItemIterator FileItemIterator iter =upload.getItemIterator(request);
在其hasNext()中返回false iter.hasNext()
怎么了?
代码和Web部件如下:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { /** * Apache commons file upload method will be used */ // Check that we have a file upload request boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (isMultipart) { try { // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(); // Parse the request FileItemIterator iter = upload.getItemIterator(request); while (iter.hasNext()) { FileItemStream item = iter.next(); String name = item.getFieldName(); InputStream stream = item.openStream(); if (item.isFormField()) { System.out.println("Form field " + name + " with value " + Streams.asString(stream) + " detected."); } else { System.out.println("File field " + name + " with file name " + item.getName() + " detected."); // Process the input stream //... } } } catch (FileUploadException ex) { Logger.getLogger(ResourceUploadServlet.class.getName()).log(Level.SEVERE, null, ex); } }
jsp页面如下:
<form action="AServlet" method="POST" enctype="multipart/form-data"> <input type="file" name="Content" /> Description : <input type="text" name="Description" /> <input type="submit" value="Submit" /> </form>
最好,
答案1
小编典典在我的web.xml文件中。有一个过滤器
<filter> <filter-name>resourceUploadServlet</filter-name> <filter-class>org.mortbay.servlet.MultiPartFilter</filter-class> <init-param> <param-name>maxSize</param-name> <param-value>2147483648</param-value> </init-param> </filter>
当我卸下过滤器后,问题就解决了…
apache-commons commons-pool2整合 commons-net 自定 FTPClient对象池
commons-net 包介绍
commons-net 是 apachecommons 用于网络的工具包,它实现了一些常见的网络工具,如 smtp
,pop3
,telnet
,ftp
,udp
等,本文主要使用它的 ftp 工具。
使用 FTP 工具时的问题
在使用 commons-net 提供的 ftp 工具的时候 ,发现每次都要走一遍完整的连接,登录流程。每次都创建连接的话,很快就会把连接耗光,如果使用单例,则效率过低,因为只有一个连接,所以考虑用对象池的方式。
自已定义对象池的话,我之前有弄过,但要考虑好多的问题。像线程池一样,需要考虑核心对象数、最大对象数、何时创建对象 、及队列等,这时可以使用 apache 的 commons-pool2 来做一个对象池。
重要说明 : FTPClient 每次使用都需要重新连接,不然它会自动断开连接,使用会直接返回 421 ,本文章只是给个使用 commons-pool2 对象池的示例。
如何使用 commons-pool2
可以这么想,如果我要做个对象池的工具给别人用,首先要考虑的是池子里装的什么,用户要如何创建池子里的对象,然后提供方法借对象和回收对象,我可以把池子中的对象抽象出来,由一个工厂统一管理,用户的对象从我的通用对象继承或实现,或使用聚合方式 。
其实 spring-data-redis 已经给我们一个完整的使用 commons-pool2 的例子,它就是用的 commons-pool2 ,它的池中对象是 redis 连接,有兴趣可以去瞧瞧。
定义池中对象 FTPClient 的扩展对象
因为 FTPClient 的功能太过简单,连多层目录时自己创建目录都不会,所以有必要给它包装一下,这里你可以扩展常用到的方法。
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
@Slf4j
public class FtpClientExtend {
private FTPClient ftpClient ;
public FtpClientExtend(FTPClient ftpClient) {
this.ftpClient = ftpClient;
}
/**
* 列出文件列表
* @param filePath
* @return
* @throws IOException
*/
public FTPFile[] listFiles(String filePath) throws IOException {
return ftpClient.listFiles(filePath);
}
/**
* 下载文件
* @param filePath
* @return
*/
public InputStream downloadFile(String filePath) throws IOException {
return ftpClient.retrieveFileStream(filePath);
}
/**
* 存储文件
* @param s
* @param inputStream
*/
public void uploadFile(String filePath, InputStream inputStream) throws IOException {
File targetFilePath = new File(filePath);
Path path = targetFilePath.getParentFile().toPath();
Iterator<Path> iterator = path.iterator();
StringBuffer root = new StringBuffer("");
while (iterator.hasNext()){
Path next = iterator.next();
root.append("/").append(next);
//尝试切入目录
boolean success = ftpClient.changeWorkingDirectory(root.toString());
if(!success){
int mkd = ftpClient.mkd(next.toString());
ftpClient.changeWorkingDirectory(root.toString());
}
}
ftpClient.enterLocalPassiveMode();
ftpClient.setControlEncoding("UTF-8");
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
boolean storeFileResult = ftpClient.storeFile(targetFilePath.getName(), inputStream);
if (storeFileResult) {
log.debug("上传文件:" + filePath + ",到目录:" + ftpClient.printWorkingDirectory() + " 成功");
}else{
log.debug("上传文件:" + filePath + ",到目录:" + ftpClient.printWorkingDirectory() + " 失败");
}
}
}
使用聚合包裹池中对象
这个包裹对象的类才是工厂真正产生在池中的类,文末给出图示
import org.apache.commons.pool2.PooledObjectFactory;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
public class FtpClientPool extends GenericObjectPool<FtpClientExtend> {
public FtpClientPool(PooledObjectFactory<FtpClientExtend> factory) {
super(factory);
}
public FtpClientPool(PooledObjectFactory<FtpClientExtend> factory, GenericObjectPoolConfig config) {
super(factory, config);
}
}
建立创建对象的工厂
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.pool2.BasePooledObjectFactory;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;
public class FtpClientFactory extends BasePooledObjectFactory<FtpClientExtend> {
@Value("${ftp.host:localhost}")
private String host;
@Value("${ftp.port:21}")
private int port;
@Value("${ftp.username:ftpadmin}")
private String username;
@Value("${ftp.password:salt202}")
private String password;
@Override
public FtpClientExtend create() throws Exception {
FTPClient ftpClient = new FTPClient();
ftpClient.connect(host,port);
boolean login = ftpClient.login(username, password);
if(!login){
throw new RuntimeException("ftp 登录失败,检查用户名密码是否正确["+host+":"+port+"]["+username+"]["+password+"]");
}
return new FtpClientExtend(ftpClient);
}
@Override
public PooledObject<FtpClientExtend> wrap(FtpClientExtend ftpClientExtend) {
return new DefaultPooledObject(ftpClientExtend);
}
}
使用方法
@Autowired
private FtpClientPool ftpClientPool;
public void method(){
FtpClientExtend ftpClientExtend = null;
try{
ftpClientExtend = ftpClientPool.borrowObject();
}finally{
if(ftpClientExtend != null) {
ftpClientPool.returnObject(ftpClientExtend);
}
}
}
原理图示
commons-fileUpload.jar fileUpload.parseRequest (request); 为什么获取不到值
fileUpload.parseRequest (request); 为什么获取不到值?
上传 servlet:
// 上传路径
File file = new File("d:/upload");
// 临时文件路径
File tempFile = new File("d:/uploadtemp");
if(!file.exists()){
file.mkdir();
}
if(!tempFile.exists()){
tempFile.mkdir();
}
if(ServletFileUpload.isMultipartContent(request)){
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024*10);
factory.setRepository(tempFile);
ServletFileUpload fileUpload = new ServletFileUpload(factory);
fileUpload.setSizeMax(1024*1024*10);
try {
List<FileItem> items = fileUpload.parseRequest(request);
for (FileItem item : items) {
if(!item.isFormField()){
String name = item.getName();
System.out.println("name:" + name);
System.out.println("length:" + item.getSize());
item.write(new File("d:/upload/"+name));
}else{
String desc = item.getString("UTF-8");
System.out.println ("文件描述:"+desc);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}else{
System.out.println("==========================");
throw new RuntimeException ("请设置 form 表单的 enctype 属性");
}
前台表单:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>upload page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="servlet/UpLoadServlet" enctype="multipart/form-data" method="post">
文 件:<input type="file" name=""/><input type="submit"value=" 上传 "/>
</form>
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>UpLoadServlet</servlet-name>
<servlet-class>com.cmbc.servlet.UpLoadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UpLoadServlet</servlet-name>
<url-pattern>/servlet/UpLoadServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
今天关于Commons-fileupload 1.3.3 发布,Java 文件上传组件和java文件上传插件的讲解已经结束,谢谢您的阅读,如果想了解更多关于
本文标签: