Проблемы с загрузкой файлов с ServletFileUpload
Я нашел проблему, ответьте ниже:
Оригинальный вопрос: нуб программист здесь. Я работаю над проектом сервера openfire, где наша команда пытается интегрировать плагин службы push-уведомлений Apple. Однако, у плагина, который я обнаружил, есть некоторые проблемы в коде, и страница jsp никогда не могла появиться в консоли администратора openfire.
После многочисленных часов ручной отладки (потому что я полностью отстой и не имею представления о модуле загрузки файлов apache), я понял, что проблема заключается в этой строке:
List<FileItem> multiparts = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
Если я отключу все предложение try, страница будет отображаться нормально. Конечно, это означает, что эта страница JSP потеряет возможность сохранять загруженные файлы. После очередных бесчисленных поисков этой линии я ничего не обнаружил, поэтому решил спросить об этом здесь и попробовать.
Я не очень понимаю, что случилось с этой строкой, затмение дал мне предупреждение Type safety: The expression of type List needs unchecked conversion to conform to List<FileItem>
, но плагин компилируется и собирается нормально. Синтаксис также выглядит правильно для меня (некоторое время гуглил, видел людей, использующих тот же синтаксис тоже). Openfire довольно бесполезен в отладке, никакой ценной информации не было зарегистрировано в error.log или debug.log.
Вот весь файл JSP, если это помогает. Заранее спасибо.
apns.jsp:
<%@ page import="java.io.File,
java.util.List,
org.jivesoftware.openfire.XMPPServer,
org.jivesoftware.util.*,
com.wecapslabs.openfire.plugin.apns.ApnsPlugin,
org.apache.commons.fileupload.FileItem,
org.apache.commons.fileupload.disk.DiskFileItemFactory,
org.apache.commons.fileupload.servlet.ServletFileUpload,
org.apache.commons.fileupload.FileUploadException"
errorPage="error.jsp"
%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt" %>
<%-- Define Administration Bean --%>
<jsp:useBean id="admin" class="org.jivesoftware.util.WebManager" />
<c:set var="admin" value="${admin.manager}" />
<% admin.init(request, response, session, application, out ); %>
<% // Get parameters
boolean save = request.getParameter("save") != null;
boolean success = request.getParameter("success") != null;
boolean error = request.getParameter("error") != null;
String password = ParamUtils.getParameter(request, "password");
String badge = ParamUtils.getParameter(request, "badge");
String sound = ParamUtils.getParameter(request, "sound");
String production = ParamUtils.getParameter(request, "production");
ApnsPlugin plugin = (ApnsPlugin) XMPPServer.getInstance().getPluginManager().getPlugin("apns");
// Handle a save
if (save) {
plugin.setPassword(password);
plugin.setBadge(badge);
plugin.setSound(sound);
plugin.setProduction(production);
try {
List<FileItem> multiparts = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
for (FileItem item : multiparts) {
if (!item.isFormField()) {
String filename = item.getName();
item.write(new File(ApnsPlugin.keystorePath()));
}
}
response.sendRedirect("apns.jsp?success=true");
return;
} catch (Exception e) {
response.sendRedirect("apns.jsp?error=true");
return;
}
}
password = plugin.getPassword();
badge = Integer.toString(plugin.getBadge());
sound = plugin.getSound();
production = plugin.getProduction() ? "true" : "false";
%>
<html>
<head>
<title>APNS Settings Properties</title>
<meta name="pageID" content="apns-settings"/>
</head>
<body>
<% if (success) { %>
<div class="jive-success">
<table cellpadding="0" cellspacing="0" border="0">
<tbody>
<tr><td class="jive-icon"><img src="images/success-16x16.gif" width="16" height="16" border="0"></td>
<td class="jive-icon-label">
APNS certificate updated successfully.
</td></tr>
</tbody>
</table>
</div><br>
<% } %>
<form action="apns.jsp?save" method="post" enctype="multipart/form-data">
<div class="jive-contentBoxHeader">APNS certificate</div>
<div class="jive-contentBox">
<label for="file">p12 certificate:</label>
<input type="file" name="file" />
<br>
<label for="password">certificate password:</label>
<input type="password" name="password" value="<%= password %>" />
<br>
<label for="badge">payload badge</label>
<input type="badge" name="badge" value="<%= badge %>" />
<br>
<label for="sound">payload sound</label>
<input type="badge" name="sound" value="<%= sound %>" />
<br>
<label for="production">sandbox or production</label>
<input type="radio" name="production" value="false" <%= production.equals("true") ? "" : "checked" %>>Sandbox
<input type="radio" name="production" value="true" <%= production.equals("true") ? "checked" : "" %>>Production
</div>
<input type="submit" value="Save">
</form>
</body>
</html>
1 ответ
Позвольте мне ответить на мои собственные вопросы здесь -
Поскольку eclipse не предупредил меня о проблеме импорта, я думал, что все, что нужно плагину, было включено, но не было.
Поскольку openfire на самом деле не говорит вам, что пошло не так, вы не представляете, что это был пропущенный импорт.
Поскольку плагин не удалось установить через плагин maven openfire (автор перестал поддерживать плагин...), мне пришлось вручную связать исходные файлы с исходным кодом openfire, и неизбежно пропустил самое важное, что сделал для нас maven - проверку зависимостей.
Оказывается, все, что мне нужно, это commons-fileupload.jar и commons-io.jar, согласно этому посту: Как загрузить файлы на сервер, используя JSP/Servlet?
Поместите файлы в {plugin-name}/lib, перестройте и вуаля.