GVKun编程网logo

Commons-fileupload 1.3.3 发布,Java 文件上传组件(java文件上传插件)

3

如果您对Commons-fileupload1.3.3发布,Java文件上传组件感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于Commons-fileupload1.3.3

如果您对Commons-fileupload 1.3.3 发布,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 发布,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)

<FileUpLoad> 文件上传组件

文件上传组件

前提条件:

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 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对象池

apache-commons commons-pool2整合 commons-net 自定 FTPClient对象池

commons-net 包介绍

commons-net 是 apachecommons 用于网络的工具包,它实现了一些常见的网络工具,如 smtppop3telnetftpudp 等,本文主要使用它的 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); 为什么获取不到值

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文件上传插件的讲解已经结束,谢谢您的阅读,如果想了解更多关于 文件上传组件、Apache Commons FileUpload FileItemIterator hasNext()返回false、apache-commons commons-pool2整合 commons-net 自定 FTPClient对象池、commons-fileUpload.jar fileUpload.parseRequest (request); 为什么获取不到值的相关知识,请在本站搜索。

本文标签: