2 回答
TA贡献1783条经验 获得超5个赞
您可以使用 jsp 将文件上传到带有其他输入字段的服务器。
前任。索引.jsp
<form action="upload.jsp" method="post" enctype="multipart/form-data">
<input type="file" name="file" size="50" />
<br>
<input type="text" name="name" />
<br />
<input type="submit" value="Upload File" />
</form>
上传.jsp
<%@ page import="java.io.*,java.util.*, javax.servlet.*"%>
<%@ page import="javax.servlet.http.*"%>
<%@ page import="org.apache.commons.fileupload.*"%>
<%@ page import="org.apache.commons.fileupload.disk.*"%>
<%@ page import="org.apache.commons.fileupload.servlet.*"%>
<%@ page import="org.apache.commons.io.output.*"%>
<html>
<head>
</head>
<body>
<%
File file;
int maxFileSize = 5000 * 1024;
int maxMemSize = 5000 * 1024;
String filePath = "D:/";
String contentType = request.getContentType();
if ((contentType.indexOf("multipart/form-data") >= 0)) {
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(maxMemSize);
factory.setRepository(new File("c:\\temp"));
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(maxFileSize);
try {
List fileItems = upload.parseRequest(request);
Iterator i = fileItems.iterator();
out.println("<html>");
out.println("<body>");
while (i.hasNext()) {
FileItem fi = (FileItem) i.next();
if (!fi.isFormField()) {
String fieldName = fi.getFieldName();
String fileName = fi.getName();
boolean isInMemory = fi.isInMemory();
long sizeInBytes = fi.getSize();
file = new File(filePath + fileName);
//fi.write(file);
out.println("Uploaded Filename: " + filePath + fileName + "<br>");
}else{
System.out.println(fi.getFieldName() +":"+fi.getString());
}
}
out.println("</body>");
out.println("</html>");
} catch (Exception ex) {
System.out.println(ex);
}
} else {
out.println("<html>");
out.println("<body>");
out.println("<p>No file uploaded</p>");
out.println("</body>");
out.println("</html>");
}
%>
</body>
</html>
您需要在 servlet jar 中包含 jar 文件 commons-fileupload。
TA贡献1812条经验 获得超5个赞
我发现为什么enctype="multipart/form-data"不使用jsp:setProperty and jsp:getProperty. 当我使用 tomcat 运行时,process.jsp 生成为 process_jsp.java。
dao.User bean = null;
bean = (dao.User) _jspx_page_context.getAttribute("bean", javax.servlet.jsp.PageContext.PAGE_SCOPE);
if (bean == null){
bean = new dao.User();
_jspx_page_context.setAttribute("bean", bean, javax.servlet.jsp.PageContext.PAGE_SCOPE);
out.write('\n');
org.apache.jasper.runtime.JspRuntimeLibrary.introspect(_jspx_page_context.findAttribute("bean"), request);
out.write(' ');
out.write(' ');
out.write('\n');
}
根据上面的源代码org.apache.jasper.runtime.JspRuntimeLibrary.introspect被调用。
public static void introspect(Object bean, ServletRequest request) throws JasperException
{
Enumeration<String> e = request.getParameterNames();
while ( e.hasMoreElements() ) {
String name = e.nextElement();
String value = request.getParameter(name);
introspecthelper(bean, name, value, request, name, true);
}
}
上面的代码映射请求参数和名称(bean 属性名称),然后introspecthelper将通过使用将值传递给适当的 setter 方法java.lang.reflect.Method.invoke。
与 一起工作时enctype="multipart/form-data",Enumeration<String> e = request.getParameterNames()是问题所在。没有找到元素,所以introspecthelper永远不会执行。
因为JspRuntimeLibrary.introspect是静态方法。我不能覆盖它的行为。那么,编写自定义标签或遵循如何使用 JSP/Servlet 将文件上传到服务器?是解决问题的唯一方法。
添加回答
举报
