在本文中,我们将为您详细介绍ApacheCommonsFileUploadFileItemIteratorhasNext的相关知识,并且为您解答关于返回false的疑问,此外,我们还会提供一些关于ap
在本文中,我们将为您详细介绍Apache Commons FileUpload FileItemIterator hasNext的相关知识,并且为您解答关于返回false的疑问,此外,我们还会提供一些关于apache 的 commons-fileupload 中 FileItem 类和 ServletFileUpload、FAIL - Deploy Upload Failed, Exception: [org.apache.tomcat.util.http.fileupload.FileUploadBase$Si...、FileUpload1.HasFile始终返回false、File,DiskFileItemFactory,ServletFileUpload,File...的有用信息。
本文目录一览:- Apache Commons FileUpload FileItemIterator hasNext()返回false(http返回文件)
- apache 的 commons-fileupload 中 FileItem 类和 ServletFileUpload
- FAIL - Deploy Upload Failed, Exception: [org.apache.tomcat.util.http.fileupload.FileUploadBase$Si...
- FileUpload1.HasFile始终返回false
- File,DiskFileItemFactory,ServletFileUpload,File...
Apache Commons FileUpload FileItemIterator hasNext()返回false(http返回文件)
我正在使用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-fileupload 中 FileItem 类和 ServletFileUpload
FileItem 类的常用方法
1.boolean isFormField ()。isFormField 方法用来判断 FileItem 对象里面封装的数据是一个普通文本表单字段,还是一个文件表单字段。如果是普通文本表单字段,返回一个 true 否则返回一个 false。因此可以用该方法判断是否是普通表单域还是文件上传表单域。
2.String getName ()。getName 方法用来获得文件上传字段中的文件名。
3.String getFieldName ()。getFieldName 方法用来返回表单标签的 name 属性的值。
4.void write (File file)。write 方法将 FileItem 对象中的内容保存到某个指定的文件中。如果 FileItem 对象中的内容是保存在某个临时文件中,该方法完成后,临时文件可以会被删除。该方法也可以将普通表单字段保存在一个文件中,但最主要的用途是把上传的文件内容保存在本地文件系统中。
5.String getString ()。getString () 方法将 FileItem 对象中保存的数据流内容以一个字符串返回。它有两个重载形式。public java.lang.String getString () 和 public java.lang.String getString (java.lang.String encodeing) throws java.io.UnsupportedEncodingException。前者使用缺省的字符集编码将主体内容转换成字符串,后者使用参数指定的字符集编码。如果在读取普通表单字段元素的内容时,出现了乱码现象,可以调用第二个方法,并传入 正确的字符集编码名称。
6.String getContentType ()。此方法用来获得上传文件的类型,即标段字段元素描述头属性 “content-type” 的值,如 image/jpeg。如果 FileItem 对象对应的是普通的表单字段,将返回 null。
7.boolean isInMemory ()。判断 FileItem 对象封装的数据是保存在内存中还是硬盘中。
8.void delete ()。此方法用来清空 FileItem 对象中封装的主体内容,如果内容是被保存在临时文件中,该方法会把临时文件删除。
9.InputStream getInputStream ()。以流的形式返回上传文件的主体内容。
10.long getSize ()。返回上传文件的大小。
ServletFileUpload 类
1.FileItemIterator getItemIterator (HttpServletRequest request): 获取文件项的迭代器
Processes an RFC 1867 compliant multipart/form-data stream.
2.static boolean isMultipartContent (HttpServletRequest request): 判断是否包含多部分的内容(在这里可能是上传的文件)
Utility method that determines whether the request contains multipart content.
3.Map<String,List<FileItem>> parseParameterMap (HttpServletRequest request): 将 HttpServletRequst 转化成 map
Processes an RFC 1867 compliant multipart/form-data stream.
4.List<FileItem> parseRequest (HttpServletRequest request): 将 HttpServletRequst 转化成含 FileItem 的 List
Processes an RFC 1867 compliant multipart/form-data stream.
FAIL - Deploy Upload Failed, Exception: [org.apache.tomcat.util.http.fileupload.FileUploadBase$Si...
Message: | |
https://maxrohde.com/2011/04/27/large-war-file-cannot-be-deployed-in-tomcat-7/
Solution
Go to the web.xml of the manager application (for instance it could be under /tomcat7/webapps/manager/WEB-INF/web.xml.
Increase the max-file-size and max-request-size:
<multipart-config>
<!– 50MB max –>
<max-file-size>52428800</max-file-size>
<max-request-size>52428800</max-request-size>
<file-size-threshold>0</file-size-threshold>
</multipart-config>
FileUpload1.HasFile始终返回false
如何解决FileUpload1.HasFile始终返回false?
|| 我正在使用ASP.net文件上传控件上传文件。 我的FileUpload1.HasFile总是返回false。if (FileUpload1.HasFile)
{
DBOperations db = new DBOperations();
try
{
FileUpload1.SaveAs(Server.MapPath(\"~/uploadedImages/\" + db.uploadImage(System.IO.Path.GetExtension(FileUpload1.FileName)) + System.IO.Path.GetExtension(FileUpload1.FileName)));
}
catch (Exception Ex)
{
String he = Ex.Message;
}
}
我正在使用以下ASP.net代码
<asp:UpdatePanel ID=\"fileUpload\" runat=\"server\">
<ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID=\"btnUploadFile\" EventName=\"Click\" />
</Triggers>
<asp:FileUpload ID=\"FileUpload1\" runat=\"server\" />
<asp:Button ID=\"btnUploadFile\" Text=\"Upload File\" runat=\"server\"
onclick=\"btnUploadFile_Click\" />
<br />
<asp:RegularExpressionValidator ID=\"revImage\" ControlTovalidate=\"FileUpload1\" ValidationExpression=\"^.*\\.((j|J)(p|P)(e|E)?(g|G)|(g|G)(i|I)(f|F)|(p|P)(n|N)(g|G))$\" Text=\"Invalid image type\" runat=\"server\" />
</ContentTemplate>
</asp:UpdatePanel>
我什至尝试通过删除AsyncPostBackTrigger甚至通过删除Whole asp:updatePanel来尝试,而且我的FileUpload1.HasFile总是返回false。
解决方法
<Triggers>
<asp:PostBackTrigger ControlID=\"btnUploadFile\" />
</Triggers>
单击上载按钮时,这将强制回发。
还将下面的行添加到Page_Load
Page.Form.Attributes.Add(\"enctype\",\"multipart/form-data\");
,我知道这篇文章如果很旧,但是我发现如果文件为空[0 KB],那么它也会返回false。文件中必须有一些内容,以便.HasFile进行确认。
File,DiskFileItemFactory,ServletFileUpload,File...
将请求消息实体中的每一个项目封装成单独的 DiskFileItem (FileItem 接口的实现) 对象的任务
由 org.apache.commons.fileupload.FileItemFactory 接口的默认实现
org.apache.commons.fileupload.disk.DiskFileItemFactory 来完成。当上传的文件项目比较小时,直接保存在内存中(速度比较快),比较大时,以临时文件的形式,保存在磁盘临时文件夹(虽然速度慢些,但是内存资源是有限的)。
属性
1) public static final int DEFAULT_SIZE_THRESHOLD :将文件保存在内存还是磁盘临时文件夹的默认临界值,值为 10240,即 10kb。
2) private File repository:用于配置在创建文件项目时,当文件项目大于临界值时使用的临时文件夹,默认采用系统默认的临时文件路径,可以通过系统属性 java.io.tmpdir 获取。如下代码:
System.getProperty("java.io.tmpdir");
3) private int sizeThreshold:用于保存将文件保存在内存还是磁盘临时文件夹的临界值
构造方法
1) public DiskFileItemFactory()
采用默认临界值和系统临时文件夹构造文件项工厂对象。
2) public DiskFileItemFactory(int sizeThreshold,File repository)
采用参数指定临界值和系统临时文件夹构造文件项工厂对象。
3) FileItem createItem()
根据 DiskFileItemFactory 相关配置将每一个请求消息实体项目创建成 DiskFileItem 实例,并返回。该方法从来不需要我们亲自调用,FileUpload 组件在解析请求时内部使用。
4) void setSizeThreshold(int sizeThreshold)
Apache 文件上传组件在解析上传数据中的每个字段内容时,需要临时保存解析出的数据,以便在后面进行数据的进一步处理(保存在磁盘特定位置或插入数据库)。因为 Java 虚拟机默认可以使用的内存空间是有限的,超出限制时将会抛出 “java.lang.OutOfMemoryError” 错误。如果上传的文件很大,例如 800M 的文件,在内存中将无法临时保存该文件内容,Apache 文件上传组件转而采用临时文件来保存这些数据;但如果上传的文件很小,例如 600 个字节的文件,显然将其直接保存在内存中性能会更加好些。
setSizeThreshold 方法用于设置是否将上传文件已临时文件的形式保存在磁盘的临界值(以字节为单位的 int 值),如果从没有调用该方法设置此临界值,将会采用系统默认值 10KB。对应的 getSizeThreshold () 方法用来获取此临界值。
5) void setRepository(File repository)
setRepositoryPath 方法用于设置当上传文件尺寸大于 setSizeThreshold 方法设置的临界值时,将文件以临时文件形式保存在磁盘上的存放目录。有一个对应的获得临时文件夹的 File getRespository () 方法。
注意:当从没有调用此方法设置临时文件存储目录时,默认采用系统默认的临时文件路径,可以通过系统属性 java.io.tmpdir 获取。如下代码:
System.getProperty("java.io.tmpdir");
Tomcat 系统默认临时目录为 “<tomcat 安装目录>/temp/”。
使用 common-fileUpload 制作文件上传 (DiskFileItemFactory 方式)
所需包:commons-fileupload-1.2.1.jar 和 commons-io-1.3.2.jar
在网络找了关于 JSP 上传文件问题,本来想做个利用 AJAX 做带进度条的文件上传功能,但是网络上的文章都比较复杂,看了半天都看不懂,发现自己连最简单的文件上传都没有做过,那个就暂时算了,老实点从简单的先做起再研究那个带进度条的文件上传。
在网络上找了下 jsp 上传文件的代码,有很多,但是多数人写的不清楚,不过找了一个稍微清楚点的文章,文章地址给忘了(,真对不起人家,做人还不够厚道)。下面基本原封不动的把代码贴上来,以备后用。
首先下载:commons-fileUpload-1.2 的 jar 包:http://www.apache.org/commons/, 同时可以把 commons-IO 的 jar 包一起下载,以后会用到的。
1、上传的前台页面:
<%@ page language="java" import="java.util.*" contentType="text/html;charset=gbk" pageEncoding="gbk"%>
<html>
<body>
<form action="MultipartTestServlet" enctype="multipart/form-data" method="post">
<input type="text" name="username" /><br />
<input type="file" name="myfile" /><br/>
<input type="file" name="myfile" /><br/>
<input type="submit" />
</form>
</body>
</html>
2、上传的后台代码:
后台代码是个 servlet,很简单咯,觉得比 ASP 利用组件还简单。呵呵
package upload;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.RequestContext;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.servlet.ServletRequestContext;
public class MultipartTestServlet extends HttpServlet {
public MultipartTestServlet() {
super();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置 request 编码,主要是为了处理普通输入框中的中文问题
request.setCharacterEncoding("gbk");
// 这里对 request 进行封装,RequestContext 提供了对 request 多个访问方法
RequestContext requestContext = new ServletRequestContext(request);
// 判断表单是否是 Multipart 类型的。这里可以直接对 request 进行判断,不过已经以前的用法了
if(FileUpload.isMultipartContent(requestContext)){
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置文件的缓存路径
factory.setRepository(new File("c:/tmp/"));
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置上传文件大小的上限,-1 表示无上限
upload.setSizeMax(100*1024*1024);
List items = new ArrayList();
try {
// 上传文件,并解析出所有的表单字段,包括普通字段和文件字段
items = upload.parseRequest(request);
} catch (FileUploadException e1) {
System.out.println ("文件上传发生错误" + e1.getMessage ());
}
// 下面对每个字段进行处理,分普通字段和文件字段
Iterator it = items.iterator();
while(it.hasNext()){
FileItem fileItem = (FileItem) it.next();
// 如果是普通字段
if(fileItem.isFormField()){
System.out.println(fileItem.getFieldName() + " " + fileItem.getName() + " " + new String(fileItem.getString().getBytes("iso8859-1"), "gbk"));
}else{
System.out.println(fileItem.getFieldName() + " " +
fileItem.getName() + " " +
fileItem.isInMemory() + " " +
fileItem.getContentType() + " " +
fileItem.getSize());
// 保存文件,其实就是把缓存里的数据写到目标路径下
if(fileItem.getName()!=null && fileItem.getSize()!=0){
File fullFile = new File(fileItem.getName());
File newFile = new File("c:/temp/" + fullFile.getName());
try {
fileItem.write(newFile);
} catch (Exception e) {
e.printStackTrace();
}
}else{
System.out.println ("文件没有选择 或 文件内容为空");
}
}
}
}
}
}
3、编译和配置 servlet
先设置 classpath,使它包含 commons-fileUpload 的 jar 包路径,然后进行编译即可,注意这里的包路径。
然后打开站点下的 web-inf 路径下的 web.xml,在里面添加:
<servlet>
<servlet-name>MultipartTestServlet</servlet-name>
<servlet-class>upload.MultipartTestServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>helloApp.DispatcherServlet</servlet-class>
</servlet>
好了,现在就可以文件上传了,不过运行之前记得在 c:\ 下新建 tmp 和 temp 文件夹,别忘了,不然程序会报告错误的
今天关于Apache Commons FileUpload FileItemIterator hasNext和返回false的介绍到此结束,谢谢您的阅读,有关apache 的 commons-fileupload 中 FileItem 类和 ServletFileUpload、FAIL - Deploy Upload Failed, Exception: [org.apache.tomcat.util.http.fileupload.FileUploadBase$Si...、FileUpload1.HasFile始终返回false、File,DiskFileItemFactory,ServletFileUpload,File...等更多相关知识的信息可以在本站进行查询。
本文标签: