diff --git a/docs-web/src/main/java/com/sismics/docs/rest/resource/FileResource.java b/docs-web/src/main/java/com/sismics/docs/rest/resource/FileResource.java index b7294f25..ef7643a1 100644 --- a/docs-web/src/main/java/com/sismics/docs/rest/resource/FileResource.java +++ b/docs-web/src/main/java/com/sismics/docs/rest/resource/FileResource.java @@ -1,5 +1,21 @@ package com.sismics.docs.rest.resource; +import java.io.IOException; +import java.io.InputStream; +import java.net.URISyntaxException; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.text.MessageFormat; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import org.glassfish.jersey.media.multipart.FormDataBodyPart; +import org.glassfish.jersey.media.multipart.FormDataParam; + import com.google.common.base.Strings; import com.google.common.collect.Lists; import com.google.common.io.ByteStreams; @@ -27,30 +43,27 @@ import com.sismics.util.HttpUtil; import com.sismics.util.JsonUtil; import com.sismics.util.context.ThreadLocalContext; import com.sismics.util.mime.MimeType; -import org.glassfish.jersey.media.multipart.FormDataBodyPart; -import org.glassfish.jersey.media.multipart.FormDataParam; import jakarta.json.Json; import jakarta.json.JsonArrayBuilder; import jakarta.json.JsonObjectBuilder; -import jakarta.ws.rs.*; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.FormParam; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.NotFoundException; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.WebApplicationException; import jakarta.ws.rs.core.HttpHeaders; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; import jakarta.ws.rs.core.Response.Status; import jakarta.ws.rs.core.StreamingOutput; -import java.io.IOException; -import java.io.InputStream; -import java.net.URISyntaxException; -import java.net.URLDecoder; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; -import java.text.MessageFormat; -import java.util.List; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; /** * File REST resources. @@ -637,7 +650,7 @@ public class FileResource extends BaseResource { } Response.ResponseBuilder builder = Response.ok(stream) - .header(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=\"" + file.getFullName("data") + "\"") + .header(HttpHeaders.CONTENT_DISPOSITION, "inline; filename*=utf-8''" + filenameEncode( file.getFullName("data") )) .header(HttpHeaders.CONTENT_TYPE, mimeType); if (decrypt) { // Cache real files @@ -651,6 +664,15 @@ public class FileResource extends BaseResource { return builder.build(); } + private String filenameEncode(String name) { + try { + return java.net.URLEncoder.encode(name, "UTF-8").replace("+", "%20"); + } catch (java.io.UnsupportedEncodingException e) { + e.printStackTrace(); + return name; + } + } + /** * Returns all files from a document, zipped. *