Skip to content

Commit

Permalink
InputStream -> is.available() is limited to 2GB not allowing file >2G…
Browse files Browse the repository at this point in the history
…B to download properly (#42)

Fix #40
  • Loading branch information
gnujavasergio authored and monkiki committed Nov 14, 2017
1 parent 3596341 commit 29160d7
Show file tree
Hide file tree
Showing 7 changed files with 48 additions and 26 deletions.
2 changes: 1 addition & 1 deletion src/main/java/com/openkm/servlet/DownloadServlet.java
Expand Up @@ -81,7 +81,7 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) thro

log.info("Download {} by {} ({})", new Object[]{path, userId, (inline ? "inline" : "attachment")});
is = OKMDocument.getInstance().getContent(null, path, false);
WebUtils.sendFile(request, response, fileName, doc.getMimeType(), inline, is);
WebUtils.sendFile(request, response, fileName, doc.getMimeType(), inline, is, doc.getActualVersion().getSize());
} else {
response.setContentType("text/plain; charset=UTF-8");
PrintWriter out = response.getWriter();
Expand Down
1 change: 1 addition & 0 deletions src/main/java/com/openkm/servlet/ImageLogoServlet.java
Expand Up @@ -47,6 +47,7 @@ public class ImageLogoServlet extends HttpServlet {
/**
*
*/
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
String img = request.getPathInfo();

Expand Down
Expand Up @@ -331,9 +331,10 @@ private void downloadVersion(String uuid, HttpServletRequest request, HttpServle
String fileName = WebUtils.getString(request, "fileName");
String mimeType = WebUtils.getString(request, "mimeType");
InputStream is = NodeDocumentVersionDAO.getInstance().getVersionContentByParent(uuid, name);
NodeDocumentVersion ndv = NodeDocumentVersionDAO.getInstance().findVersion(uuid, name);

try {
WebUtils.sendFile(request, response, fileName, mimeType, false, is);
WebUtils.sendFile(request, response, fileName, mimeType, false, is, ndv.getSize());
} finally {
IOUtils.closeQuietly(is);
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/openkm/servlet/admin/LogCatServlet.java
Expand Up @@ -127,7 +127,7 @@ private void view(HttpServletRequest request, HttpServletResponse response) thro
@SuppressWarnings("unchecked")
private void purge(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
log.debug("purge({}, {})", request, response);
for (File lf : (Collection<File>) FileUtils.listFiles(logFolder, null, false)) {
for (File lf : FileUtils.listFiles(logFolder, null, false)) {
if (lf.getName().matches(".+[0-9][0-9]-[0-9][0-9]-[0-9][0-9].*")) {
lf.delete();
}
Expand Down
48 changes: 30 additions & 18 deletions src/main/java/com/openkm/servlet/frontend/DownloadServlet.java
Expand Up @@ -21,33 +21,36 @@

package com.openkm.servlet.frontend;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.compress.archivers.ArchiveException;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.openkm.api.OKMDocument;
import com.openkm.api.OKMMail;
import com.openkm.api.OKMRepository;
import com.openkm.api.OKMSearch;
import com.openkm.bean.Document;
import com.openkm.bean.Mail;
import com.openkm.bean.Repository;
import com.openkm.bean.Version;
import com.openkm.core.*;
import com.openkm.frontend.client.OKMException;
import com.openkm.frontend.client.constants.service.ErrorCode;
import com.openkm.util.*;
import com.openkm.util.impexp.RepositoryExporter;
import com.openkm.util.impexp.TextInfoDecorator;
import org.apache.commons.compress.archivers.ArchiveException;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
* Document download servlet
Expand All @@ -58,6 +61,7 @@ public class DownloadServlet extends OKMHttpServlet {
private static final boolean exportZip = true;
private static final boolean exportJar = false;

@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
log.debug("service({}, {})", request, response);
request.setCharacterEncoding("UTF-8");
Expand Down Expand Up @@ -119,7 +123,7 @@ protected void service(HttpServletRequest request, HttpServletResponse response)
is = new FileInputStream(tmp);

// Send document
WebUtils.sendFile(request, response, fileName, MimeTypeConfig.MIME_ZIP, inline, is);
WebUtils.sendFile(request, response, fileName, MimeTypeConfig.MIME_ZIP, inline, is, tmp.length());
} else if (exportJar) {
// Get document
FileOutputStream os = new FileOutputStream(tmp);
Expand All @@ -130,17 +134,25 @@ protected void service(HttpServletRequest request, HttpServletResponse response)

// Send document
String fileName = PathUtils.getName(path) + ".jar";
WebUtils.sendFile(request, response, fileName, "application/x-java-archive", inline, is);
WebUtils.sendFile(request, response, fileName, "application/x-java-archive", inline, is, tmp.length());
}
} else {
if (OKMDocument.getInstance().isValid(null, path)) {
// Get document
Document doc = OKMDocument.getInstance().getProperties(null, path);
long overallSize = doc.getActualVersion().getSize();

if (ver != null && !ver.equals("")) {
is = OKMDocument.getInstance().getContentByVersion(null, path, ver);
for (Version version : OKMDocument.getInstance().getVersionHistory(null, path)) {
if (version.getName().equals(ver)) {
overallSize = version.getSize();
break;
}
}
} else {
is = OKMDocument.getInstance().getContent(null, path, checkout != null);
ver = doc.getActualVersion().getName();
}

// Send document
Expand All @@ -152,13 +164,13 @@ protected void service(HttpServletRequest request, HttpServletResponse response)
if (ver != null && !ver.equals("")) {
versionToAppend = " rev " + ver;
} else {
versionToAppend = " rev " + OKMDocument.getInstance().getProperties(null, uuid).getActualVersion().getName();
versionToAppend = " rev " + doc.getActualVersion().getName();
}
String[] nameParts = fileName.split("\\.(?=[^\\.]+$)");
fileName = nameParts[0] + versionToAppend + "." + nameParts[1];
}

WebUtils.sendFile(request, response, fileName, doc.getMimeType(), inline, is);
WebUtils.sendFile(request, response, fileName, doc.getMimeType(), inline, is, overallSize);
} else if (OKMMail.getInstance().isValid(null, path)) {
// Get mail
Mail mail = OKMMail.getInstance().getProperties(null, path);
Expand Down
Expand Up @@ -39,6 +39,7 @@ public class ExecuteReportServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static Logger log = LoggerFactory.getLogger(ExecuteReportServlet.class);

@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException,
ServletException {
log.debug("doGet({}, {})", request, response);
Expand Down
17 changes: 12 additions & 5 deletions src/main/java/com/openkm/util/WebUtils.java
Expand Up @@ -292,18 +292,25 @@ private static String getHeader(HttpServletRequest request, String name) {
}

/**
* Send file to client browser.
*
* @throws IOException If there is a communication error.
* {@link #sendFile(HttpServletRequest, HttpServletResponse, String, String, boolean, InputStream, long)}
*/
public static void sendFile(HttpServletRequest request, HttpServletResponse response,
String fileName, String mimeType, boolean inline, InputStream is) throws IOException {
log.debug("sendFile({}, {}, {}, {}, {}, {})", new Object[]{request, response, fileName, mimeType, inline, is});
sendFile(request, response, fileName, mimeType, inline, is, is.available());
}

/**
* Send file to client browser.
*/
public static void sendFile(HttpServletRequest request, HttpServletResponse response, String fileName, String mimeType,
boolean inline, InputStream is, long overallSize) throws IOException {
log.debug("sendFile({}, {}, {}, {}, {}, {})", new Object[]{request, response, fileName, mimeType, inline, is});
prepareSendFile(request, response, fileName, mimeType, inline);

// Set length
response.setContentLength(is.available());
log.debug("File: {}, Length: {}", fileName, is.available());
response.addHeader("Content-Length", Long.toString(overallSize));
log.debug("File: {}, Length: {}", fileName, overallSize);

ServletOutputStream sos = response.getOutputStream();
IOUtils.copy(is, sos);
Expand Down

0 comments on commit 29160d7

Please sign in to comment.