FileItemIterator를 사용할 때 양식의 각 항목을 확인할 수 있습니다. 내가 아는 한 그들은 순서대로 HTML에 있습니다.
필자가 작성한 이전 함수 에서처럼 반복기가 양식 필드인지 또는 업로드 파일인지 알려줍니다.
파일 업로드를 처리 할 때 getFieldName()을 사용하여 양식 필드를 식별하고 getName()을 사용하여 클라이언트에서 파일 이름을 처리하십시오.
web.xml 파일의 매개 변수에 서블릿을 할당하는 데 어려움이 있습니다.
다음 코드가 도움이되기를 바랍니다.
<context-param>
<!-- max size of the upload request -->
<param-name>maxSize</param-name>
<param-value>3145728</param-value>
</context-param>
<context-param>
<!-- max size of any uploaded file -->
<param-name>maxFileSize</param-name>
<param-value>1024000</param-value>
</context-param>
<context-param>
<!-- Useful in development mode to slow down the uploads in fast networks.
Put the number of milliseconds to sleep in each block received in the server.
false or 0, means don't use slow uploads -->
<param-name>slowUploads</param-name>
<param-value>200</param-value>
</context-param>
<servlet>
<servlet-name>fileUpload</servlet-name>
<servlet-class>com.parity.mediamanager.server.FileUploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>fileUpload</servlet-name>
<url-pattern>/fileupload</url-pattern>
</servlet-mapping>
public class FileUploadServlet extends HttpServlet {
private static final long serialVersionUID = -6988332690679764038L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException {
String path = "/home/tomcat/engage/media/";
String user = "";
if (ServletFileUpload.isMultipartContent(request)) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
boolean gotPath = false;
String message = "";
String media_category = "";
StringBuilder sb = new StringBuilder();
sb.append(Shared.getTimeStamp() + ": Uploading med files to category - ");
try {
FileItemIterator it = upload.getItemIterator(request);
while (it.hasNext()) {
FileItemStream item = it.next();
//message += item.getFieldName() + ": ";
if (item.isFormField()) {
if (item.getFieldName().equals("MediaCategory")) {
media_category = Streams.asString(item.openStream());
path += media_category;
gotPath = true;
message += path + System.lineSeparator();
} else if (item.getFieldName().equals("UserName")) {
user += Streams.asString(item.openStream());
}
} else {
if (gotPath) {
String fileout = path + "/" + item.getName();
message += fileout + System.lineSeparator();
InputStream input = null;
OutputStream output = null;
try {
output = new FileOutputStream(new File(fileout));
input = item.openStream();
byte[] buffer = new byte[256];
int count;
while ((count = input.read(buffer)) > 0) {
output.write(buffer, 0, count);
}
} finally {
input.close();
output.close();
}
}
}
}
} catch (Exception e) {
response.sendRedirect("Error on item: " + e.getLocalizedMessage());
}
response.setStatus(HttpServletResponse.SC_CREATED);
//response.getWriter().print(message);
sb.append(message + System.lineSeparator());
Shared.writeUserLog(user, sb.toString());
} else {
response.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE,
"Unsupported media type...");
}
}
}
web.xml을 나는 서블릿 설정이 작동 알고 있지만 실제로 차이를 만들 경우 여전히 상황에 맞는 PARAMS에 대해 확실 해요합니다.
순서가 확실하지 않지만 FileItemIterator를 사용하여 반복 할 때 필드 이름을 확인할 수 있으므로 어느 필드가 처리되는지 알 수 있습니다. 파일 선택기에서 위젯 당 하나가 아닌 여러 개의 파일을 선택할 수도 있습니다. 그것이 마지막으로 사용한 것을 말하지만, 파일 위젯 이전에 파싱 된 필드는 숨겨져있었습니다. – WLGfx
위의 예제를 사용하면 필드 이름에 "File 1"등이 표시됩니다. 나는 파일의 이름을 미리 알지 못할 것이고 모두 같은 유형이다. –
예, 맞습니다. getFieldName()은 필드 이름을 반환하고 getName()은 업로드의 파일 이름을 반환합니다. – WLGfx