Migrate to Apache file upload API 2 w/ Jakarta

This commit is contained in:
Tobi Schäfer 2024-05-25 15:46:19 +02:00
parent 3dbcd792a6
commit 90e45c9115
Signed by: tobi
GPG key ID: 91FAE6FE2EBAC4C8
3 changed files with 25 additions and 15 deletions

View file

@ -60,7 +60,8 @@ configurations {
dependencies { dependencies {
implementation 'com.google.code.gson:gson:2.10.1' implementation 'com.google.code.gson:gson:2.10.1'
implementation 'commons-codec:commons-codec:1.17.0' implementation 'commons-codec:commons-codec:1.17.0'
implementation 'commons-fileupload:commons-fileupload:1.5' implementation 'org.apache.commons:commons-fileupload2-core:2.0.0-M2'
implementation 'org.apache.commons:commons-fileupload2-jakarta:2.0.0-M1'
implementation 'commons-logging:commons-logging:1.3.2' implementation 'commons-logging:commons-logging:1.3.2'
implementation 'commons-net:commons-net:3.10.0' implementation 'commons-net:commons-net:3.10.0'
implementation 'com.sun.mail:javax.mail:1.6.2' implementation 'com.sun.mail:javax.mail:1.6.2'

View file

@ -24,18 +24,27 @@ import helma.framework.core.Application;
import helma.util.*; import helma.util.*;
import java.io.*; import java.io.*;
import java.util.*; import java.nio.charset.Charset;
import java.nio.charset.UnsupportedCharsetException;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.*;
import jakarta.servlet.*; import jakarta.servlet.*;
import jakarta.servlet.http.*; import jakarta.servlet.http.*;
import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.Base64;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.*; import org.apache.commons.fileupload2.core.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.fileupload2.core.FileItem;
import org.apache.commons.fileupload.servlet.ServletRequestContext; import org.apache.commons.fileupload2.core.FileUploadException;
import org.apache.commons.fileupload2.core.FileUploadSizeException;
import org.apache.commons.fileupload2.core.ProgressListener;
import org.apache.commons.fileupload2.jakarta.JakartaServletDiskFileUpload;
import org.apache.commons.fileupload2.jakarta.JakartaServletFileUpload;
import org.apache.commons.fileupload2.jakarta.JakartaServletRequestContext;
/** /**
* This is an abstract Hop servlet adapter. This class communicates with hop applications * This is an abstract Hop servlet adapter. This class communicates with hop applications
@ -222,7 +231,7 @@ public abstract class AbstractServletClient extends HttpServlet {
List uploads = null; List uploads = null;
JakartaServletRequestContext reqcx = new JakartaServletRequestContext(request); JakartaServletRequestContext reqcx = new JakartaServletRequestContext(request);
if (ServletFileUpload.isMultipartContent(reqcx)) { if (JakartaServletFileUpload.isMultipartContent(reqcx)) {
// get session for upload progress monitoring // get session for upload progress monitoring
UploadStatus uploadStatus = getApplication().getUploadStatus(reqtrans); UploadStatus uploadStatus = getApplication().getUploadStatus(reqtrans);
try { try {
@ -230,7 +239,7 @@ public abstract class AbstractServletClient extends HttpServlet {
} catch (Exception upx) { } catch (Exception upx) {
log("Error in file upload", upx); log("Error in file upload", upx);
String message; String message;
boolean tooLarge = (upx instanceof FileUploadBase.SizeLimitExceededException); boolean tooLarge = (upx instanceof FileUploadSizeException);
if (tooLarge) { if (tooLarge) {
message = "File upload size exceeds limit of " + uploadLimit + " kB"; message = "File upload size exceeds limit of " + uploadLimit + " kB";
} else { } else {
@ -657,10 +666,10 @@ public abstract class AbstractServletClient extends HttpServlet {
protected List parseUploads(JakartaServletRequestContext reqcx, RequestTrans reqtrans, protected List parseUploads(JakartaServletRequestContext reqcx, RequestTrans reqtrans,
final UploadStatus uploadStatus, String encoding) final UploadStatus uploadStatus, String encoding)
throws FileUploadException, UnsupportedEncodingException { throws FileUploadException, UnsupportedCharsetException, IOException {
// handle file upload // handle file upload
DiskFileItemFactory factory = new DiskFileItemFactory(); DiskFileItemFactory factory = DiskFileItemFactory.builder().get();
FileUpload upload = new FileUpload(factory); JakartaServletFileUpload upload = new JakartaServletFileUpload(factory);
// use upload limit for individual file size, but also set a limit on overall size // use upload limit for individual file size, but also set a limit on overall size
upload.setFileSizeMax(uploadLimit * 1024); upload.setFileSizeMax(uploadLimit * 1024);
upload.setSizeMax(totalUploadLimit * 1024); upload.setSizeMax(totalUploadLimit * 1024);
@ -683,7 +692,7 @@ public abstract class AbstractServletClient extends HttpServlet {
Object value; Object value;
// check if this is an ordinary HTML form element or a file upload // check if this is an ordinary HTML form element or a file upload
if (item.isFormField()) { if (item.isFormField()) {
value = item.getString(encoding); value = item.getString(Charset.forName(encoding));
} else { } else {
value = new MimePart(item); value = new MimePart(item);
} }

View file

@ -16,7 +16,7 @@
package helma.util; package helma.util;
import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload2.core.FileItem;
import java.io.*; import java.io.*;
import java.util.Date; import java.util.Date;
@ -238,7 +238,7 @@ public class MimePart implements Serializable {
file = new File(base, filename); file = new File(base, filename);
if (fileItem != null) { if (fileItem != null) {
fileItem.write(file); fileItem.write(file.toPath());
// null out fileItem, since calling write() may have moved the temp file // null out fileItem, since calling write() may have moved the temp file
fileItem = null; fileItem = null;
} else { } else {
@ -249,7 +249,7 @@ public class MimePart implements Serializable {
// return file name // return file name
return filename; return filename;
} catch (Exception x) { } catch (Exception x) {
System.err.println("Error in MimePart.writeToFile(): " + x); System.err.println("Error in MimePart.writeToFile(): " + x);
return null; return null;
} }
} }