in jspwiki-main/src/main/java/org/apache/wiki/attachment/AttachmentServlet.java [381:477]
protected String upload( final HttpServletRequest req ) throws RedirectException, IOException {
final String msg;
final String attName = "(unknown)";
final String errorPage = m_engine.getURL( ContextEnum.WIKI_ERROR.getRequestContext(), "", null ); // If something bad happened, Upload should be able to take care of most stuff
String nextPage = errorPage;
final String progressId = req.getParameter( "progressid" );
// Check that we have a file upload request
if( !ServletFileUpload.isMultipartContent(req) ) {
throw new RedirectException( "Not a file upload", errorPage );
}
try {
final FileItemFactory factory = new DiskFileItemFactory();
// Create the context _before_ Multipart operations, otherwise strict servlet containers may fail when setting encoding.
final Context context = Wiki.context().create( m_engine, req, ContextEnum.PAGE_ATTACH.getRequestContext() );
final UploadListener pl = new UploadListener();
m_engine.getManager( ProgressManager.class ).startProgress( pl, progressId );
final ServletFileUpload upload = new ServletFileUpload( factory );
upload.setHeaderEncoding( StandardCharsets.UTF_8.name() );
if( !context.hasAdminPermissions() ) {
upload.setFileSizeMax( m_maxSize );
}
upload.setProgressListener( pl );
final List<FileItem> items = upload.parseRequest( req );
String wikipage = null;
String changeNote = null;
//FileItem actualFile = null;
final List<FileItem> fileItems = new ArrayList<>();
for( final FileItem item : items ) {
if( item.isFormField() ) {
switch( item.getFieldName() ) {
case "page":
// FIXME: Kludge alert. We must end up with the parent page name, if this is an upload of a new revision
wikipage = item.getString( StandardCharsets.UTF_8.name() );
final int x = wikipage.indexOf( "/" );
if( x != -1 ) {
wikipage = wikipage.substring( 0, x );
}
break;
case "changenote":
changeNote = item.getString( StandardCharsets.UTF_8.name() );
if( changeNote != null ) {
changeNote = TextUtil.replaceEntities( changeNote );
}
break;
case "nextpage":
nextPage = validateNextPage( item.getString( StandardCharsets.UTF_8.name() ), errorPage );
break;
}
} else {
fileItems.add( item );
}
}
if(fileItems.isEmpty()) {
throw new RedirectException( "Broken file upload", errorPage );
} else {
for( final FileItem actualFile : fileItems ) {
final String filename = actualFile.getName();
final long fileSize = actualFile.getSize();
try( final InputStream in = actualFile.getInputStream() ) {
executeUpload( context, in, filename, nextPage, wikipage, changeNote, fileSize );
}
}
}
} catch( final ProviderException e ) {
msg = "Upload failed because the provider failed: "+e.getMessage();
LOG.warn( msg + " (attachment: " + attName + ")", e );
throw new IOException( msg );
} catch( final IOException e ) {
// Show the submit page again, but with a bit more intimidating output.
msg = "Upload failure: " + e.getMessage();
LOG.warn( msg + " (attachment: " + attName + ")", e );
throw e;
} catch( final FileUploadException e ) {
// Show the submit page again, but with a bit more intimidating output.
msg = "Upload failure: " + e.getMessage();
LOG.warn( msg + " (attachment: " + attName + ")", e );
throw new IOException( msg, e );
} finally {
m_engine.getManager( ProgressManager.class ).stopProgress( progressId );
// FIXME: In case of exceptions should absolutely remove the uploaded file.
}
return nextPage;
}