FileAsset file upload now works
parent
0619a19ee2
commit
1bdddb5243
|
|
@ -71,6 +71,12 @@
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jboss.resteasy</groupId>
|
||||||
|
<artifactId>resteasy-multipart-provider</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.mvc</groupId>
|
<groupId>javax.mvc</groupId>
|
||||||
<artifactId>javax.mvc-api</artifactId>
|
<artifactId>javax.mvc-api</artifactId>
|
||||||
|
|
|
||||||
|
|
@ -18,10 +18,16 @@
|
||||||
*/package org.librecms.assets;
|
*/package org.librecms.assets;
|
||||||
|
|
||||||
import com.arsdigita.cms.ui.assets.forms.FileAssetForm;
|
import com.arsdigita.cms.ui.assets.forms.FileAssetForm;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.Table;
|
import javax.persistence.Table;
|
||||||
|
|
||||||
import org.hibernate.envers.Audited;
|
import org.hibernate.envers.Audited;
|
||||||
|
import org.librecms.ui.contentsections.assets.FileAssetCreateStep;
|
||||||
|
import org.librecms.ui.contentsections.assets.FileAssetEditStep;
|
||||||
|
import org.librecms.ui.contentsections.assets.MvcAssetEditKit;
|
||||||
|
|
||||||
import static org.librecms.CmsConstants.*;
|
import static org.librecms.CmsConstants.*;
|
||||||
import static org.librecms.assets.AssetConstants.*;
|
import static org.librecms.assets.AssetConstants.*;
|
||||||
|
|
@ -39,6 +45,10 @@ import static org.librecms.assets.AssetConstants.*;
|
||||||
labelBundle = ASSETS_BUNDLE,
|
labelBundle = ASSETS_BUNDLE,
|
||||||
descriptionKey = "fileasset.description",
|
descriptionKey = "fileasset.description",
|
||||||
descriptionBundle = ASSETS_BUNDLE)
|
descriptionBundle = ASSETS_BUNDLE)
|
||||||
|
@MvcAssetEditKit(
|
||||||
|
createStep = FileAssetCreateStep.class,
|
||||||
|
editStep = FileAssetEditStep.class
|
||||||
|
)
|
||||||
public class FileAsset extends BinaryAsset implements Serializable {
|
public class FileAsset extends BinaryAsset implements Serializable {
|
||||||
|
|
||||||
private static final long serialVersionUID = -8195062456502964401L;
|
private static final long serialVersionUID = -8195062456502964401L;
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,7 @@ import org.librecms.ui.contentsections.assets.MvcAssetCreateStep;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
@ -274,13 +275,19 @@ public class AssetFolderController {
|
||||||
assetFolderTree.buildFolderTree(section, folder)
|
assetFolderTree.buildFolderTree(section, folder)
|
||||||
);
|
);
|
||||||
|
|
||||||
contentSectionModel.setAvailableAssetTypes(
|
contentSectionModel.setAvailableAssetTypes(assetCreateSteps
|
||||||
assetCreateSteps
|
|
||||||
.stream()
|
.stream()
|
||||||
|
.sorted(
|
||||||
|
(step1, step2) -> step1.getLabel().compareTo(
|
||||||
|
step2.getLabel()
|
||||||
|
)
|
||||||
|
)
|
||||||
.collect(
|
.collect(
|
||||||
Collectors.toMap(
|
Collectors.toMap(
|
||||||
step -> step.getAssetType(),
|
step -> step.getAssetType(),
|
||||||
step -> step.getLabel()
|
step -> step.getLabel(),
|
||||||
|
(value1, value2) -> value1,
|
||||||
|
() -> new LinkedHashMap<>()
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,7 @@ public class AssetUi {
|
||||||
) {
|
) {
|
||||||
models.put("section", section.getLabel());
|
models.put("section", section.getLabel());
|
||||||
models.put("assetPath", assetPath);
|
models.put("assetPath", assetPath);
|
||||||
return "/org/librecms/ui/contentsection/assets/asset-not-found.xhtml";
|
return "org/librecms/ui/contentsection/assets/asset-not-found.xhtml";
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,7 @@ public class CmsAssetEditSteps implements MvcAssetEditSteps {
|
||||||
final Set<Class<?>> classes = new HashSet<>();
|
final Set<Class<?>> classes = new HashSet<>();
|
||||||
|
|
||||||
classes.add(BookmarkEditStep.class);
|
classes.add(BookmarkEditStep.class);
|
||||||
|
classes.add(FileAssetEditStep.class);
|
||||||
classes.add(LegalMetadataEditStep.class);
|
classes.add(LegalMetadataEditStep.class);
|
||||||
classes.add(PostalAddressEditStep.class);
|
classes.add(PostalAddressEditStep.class);
|
||||||
classes.add(SideNoteEditStep.class);
|
classes.add(SideNoteEditStep.class);
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,8 @@ package org.librecms.ui.contentsections.assets;
|
||||||
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.jboss.resteasy.plugins.providers.multipart.InputPart;
|
||||||
|
import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput;
|
||||||
import org.libreccm.l10n.GlobalizationHelper;
|
import org.libreccm.l10n.GlobalizationHelper;
|
||||||
import org.libreccm.security.AuthorizationRequired;
|
import org.libreccm.security.AuthorizationRequired;
|
||||||
import org.librecms.assets.FileAsset;
|
import org.librecms.assets.FileAsset;
|
||||||
|
|
@ -33,9 +35,12 @@ import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.net.URLConnection;
|
import java.net.URLConnection;
|
||||||
import java.util.Arrays;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.logging.Level;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import javax.activation.MimeType;
|
import javax.activation.MimeType;
|
||||||
|
|
@ -44,8 +49,6 @@ import javax.enterprise.context.RequestScoped;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.mvc.Controller;
|
import javax.mvc.Controller;
|
||||||
import javax.mvc.Models;
|
import javax.mvc.Models;
|
||||||
import javax.servlet.ServletException;
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import javax.servlet.http.Part;
|
import javax.servlet.http.Part;
|
||||||
import javax.transaction.Transactional;
|
import javax.transaction.Transactional;
|
||||||
import javax.ws.rs.Consumes;
|
import javax.ws.rs.Consumes;
|
||||||
|
|
@ -54,8 +57,8 @@ import javax.ws.rs.GET;
|
||||||
import javax.ws.rs.POST;
|
import javax.ws.rs.POST;
|
||||||
import javax.ws.rs.Path;
|
import javax.ws.rs.Path;
|
||||||
import javax.ws.rs.PathParam;
|
import javax.ws.rs.PathParam;
|
||||||
import javax.ws.rs.core.Context;
|
|
||||||
import javax.ws.rs.core.MediaType;
|
import javax.ws.rs.core.MediaType;
|
||||||
|
import javax.ws.rs.core.MultivaluedMap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|
@ -135,7 +138,12 @@ public class FileAssetEditStep extends AbstractMvcAssetEditStep {
|
||||||
);
|
);
|
||||||
|
|
||||||
editStepModel.setFileName(getFileAsset().getFileName());
|
editStepModel.setFileName(getFileAsset().getFileName());
|
||||||
editStepModel.setMimeType(getFileAsset().getMimeType().toString());
|
editStepModel.setMimeType(
|
||||||
|
Optional
|
||||||
|
.ofNullable(getFileAsset().getMimeType())
|
||||||
|
.map(MimeType::toString)
|
||||||
|
.orElse("")
|
||||||
|
);
|
||||||
editStepModel.setSize(getFileAsset().getSize());
|
editStepModel.setSize(getFileAsset().getSize());
|
||||||
|
|
||||||
final long size = getFileAsset().getSize();
|
final long size = getFileAsset().getSize();
|
||||||
|
|
@ -313,12 +321,12 @@ public class FileAssetEditStep extends AbstractMvcAssetEditStep {
|
||||||
@Consumes(MediaType.MULTIPART_FORM_DATA)
|
@Consumes(MediaType.MULTIPART_FORM_DATA)
|
||||||
@AuthorizationRequired
|
@AuthorizationRequired
|
||||||
@Transactional(Transactional.TxType.REQUIRED)
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
public String removeDescription(
|
public String uploadFile(
|
||||||
@PathParam(MvcAssetEditSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
@PathParam(MvcAssetEditSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
||||||
final String sectionIdentifier,
|
final String sectionIdentifier,
|
||||||
@PathParam(MvcAssetEditSteps.ASSET_PATH_PATH_PARAM_NAME)
|
@PathParam(MvcAssetEditSteps.ASSET_PATH_PATH_PARAM_NAME)
|
||||||
final String assetPath,
|
final String assetPath,
|
||||||
@Context final HttpServletRequest request
|
final MultipartFormDataInput input
|
||||||
) {
|
) {
|
||||||
try {
|
try {
|
||||||
init();
|
init();
|
||||||
|
|
@ -331,40 +339,32 @@ public class FileAssetEditStep extends AbstractMvcAssetEditStep {
|
||||||
if (assetPermissionsChecker.canEditAsset(getAsset())) {
|
if (assetPermissionsChecker.canEditAsset(getAsset())) {
|
||||||
final FileAsset fileAsset = getFileAsset();
|
final FileAsset fileAsset = getFileAsset();
|
||||||
|
|
||||||
final Part part;
|
final Map<String, List<InputPart>> uploadForm = input
|
||||||
final String fileName;
|
.getFormDataMap();
|
||||||
try {
|
final List<InputPart> inputParts = uploadForm.get("fileData");
|
||||||
part = request.getPart("file");
|
|
||||||
final String contentDisposition = part.getHeader(
|
|
||||||
"content-disposition"
|
|
||||||
);
|
|
||||||
fileName = Arrays
|
|
||||||
.stream(contentDisposition.split(";"))
|
|
||||||
.filter(field -> field.startsWith("filename"))
|
|
||||||
.findAny()
|
|
||||||
.map(
|
|
||||||
field -> field
|
|
||||||
.substring(field.indexOf('=') + 1)
|
|
||||||
.trim().replace("\"", "")
|
|
||||||
).orElse("");
|
|
||||||
} catch (IOException | ServletException ex) {
|
|
||||||
LOGGER.error(
|
|
||||||
"Failed to upload file for FileAsset {}:", assetPath
|
|
||||||
);
|
|
||||||
LOGGER.error(ex);
|
|
||||||
models.put("uploadFailed", true);
|
|
||||||
return buildRedirectPathForStep();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
final Part part;
|
||||||
|
String fileName = "";
|
||||||
|
String contentType = "";
|
||||||
|
for (final InputPart inputPart : inputParts) {
|
||||||
|
try {
|
||||||
|
final MultivaluedMap<String, String> headers = inputPart
|
||||||
|
.getHeaders();
|
||||||
|
fileName = getFileName(headers);
|
||||||
|
contentType = getContentType(headers);
|
||||||
final byte[] bytes = new byte[1024];
|
final byte[] bytes = new byte[1024];
|
||||||
try (InputStream fileInputStream = part.getInputStream();
|
try (InputStream inputStream = inputPart.getBody(
|
||||||
|
InputStream.class, null
|
||||||
|
);
|
||||||
ByteArrayOutputStream fileDataOutputStream
|
ByteArrayOutputStream fileDataOutputStream
|
||||||
= new ByteArrayOutputStream()) {
|
= new ByteArrayOutputStream()) {
|
||||||
while (fileInputStream.read(bytes) != -1) {
|
while (inputStream.read(bytes) != -1) {
|
||||||
fileDataOutputStream.writeBytes(bytes);
|
fileDataOutputStream.writeBytes(bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
fileAsset.setData(fileDataOutputStream.toByteArray());
|
fileAsset.setData(fileDataOutputStream.toByteArray());
|
||||||
|
}
|
||||||
|
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
LOGGER.error(
|
LOGGER.error(
|
||||||
"Failed to upload file for FileAsset {}:", assetPath
|
"Failed to upload file for FileAsset {}:", assetPath
|
||||||
|
|
@ -374,18 +374,19 @@ public class FileAssetEditStep extends AbstractMvcAssetEditStep {
|
||||||
models.put("uploadFailed", true);
|
models.put("uploadFailed", true);
|
||||||
return buildRedirectPathForStep();
|
return buildRedirectPathForStep();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fileAsset.setFileName(fileName);
|
fileAsset.setFileName(fileName);
|
||||||
fileAsset.setSize(fileAsset.getData().length);
|
fileAsset.setSize(fileAsset.getData().length);
|
||||||
try (BufferedInputStream stream = new BufferedInputStream(
|
try {
|
||||||
new ByteArrayInputStream(fileAsset.getData()))) {
|
fileAsset.setMimeType(new MimeType(contentType));
|
||||||
fileAsset.setMimeType(
|
} catch (MimeTypeParseException ex) {
|
||||||
new MimeType(URLConnection
|
LOGGER.error(
|
||||||
.guessContentTypeFromStream(stream))
|
"Failed to upload file for FileAsset {}:", assetPath
|
||||||
);
|
);
|
||||||
} catch (IOException | MimeTypeParseException ex) {
|
LOGGER.error(ex);
|
||||||
LOGGER.error("Failed to get file type.", ex);
|
|
||||||
models.put("failedToGetType", true);
|
models.put("uploadFailed", true);
|
||||||
return buildRedirectPathForStep();
|
return buildRedirectPathForStep();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -400,4 +401,26 @@ public class FileAssetEditStep extends AbstractMvcAssetEditStep {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getFileName(final MultivaluedMap<String, String> headers) {
|
||||||
|
final String[] contentDisposition = headers
|
||||||
|
.getFirst("Content-Disposition")
|
||||||
|
.split(";");
|
||||||
|
|
||||||
|
for (final String fileName : contentDisposition) {
|
||||||
|
if (fileName.trim().startsWith("filename")) {
|
||||||
|
final String[] name = fileName.split("=");
|
||||||
|
|
||||||
|
return name[1].trim().replaceAll("\"", "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getContentType(
|
||||||
|
final MultivaluedMap<String, String> headers
|
||||||
|
) {
|
||||||
|
return headers.getFirst("Content-Type");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ public class FileAssetEditStepModel {
|
||||||
|
|
||||||
private Map<String, String> descriptionValues;
|
private Map<String, String> descriptionValues;
|
||||||
|
|
||||||
private List<String> descriptionLocales;
|
private List<String> unusedDescriptionLocales;
|
||||||
|
|
||||||
private String fileName;
|
private String fileName;
|
||||||
|
|
||||||
|
|
@ -57,14 +57,14 @@ public class FileAssetEditStepModel {
|
||||||
this.descriptionValues = new HashMap<>(descriptionValues);
|
this.descriptionValues = new HashMap<>(descriptionValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<String> getDescriptionLocales() {
|
public List<String> getUnusedDescriptionLocales() {
|
||||||
return Collections.unmodifiableList(descriptionLocales);
|
return Collections.unmodifiableList(unusedDescriptionLocales);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void setUnusedDescriptionLocales(
|
protected void setUnusedDescriptionLocales(
|
||||||
final List<String> descriptionLocales
|
final List<String> descriptionLocales
|
||||||
) {
|
) {
|
||||||
this.descriptionLocales = new ArrayList<>(descriptionLocales);
|
this.unusedDescriptionLocales = new ArrayList<>(descriptionLocales);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getFileName() {
|
public String getFileName() {
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@
|
||||||
editDialogValueLabel="#{CmsAssetsStepsDefaultMessagesBundle['fileasset.editstep.description.edit.value.label']}"
|
editDialogValueLabel="#{CmsAssetsStepsDefaultMessagesBundle['fileasset.editstep.description.edit.value.label']}"
|
||||||
editMethod="#{mvc.basePath}/#{ContentSectionModel.sectionName}/assets/#{CmsSelectedAssetModel.assetPath}/@fileasset-edit/description/edit"
|
editMethod="#{mvc.basePath}/#{ContentSectionModel.sectionName}/assets/#{CmsSelectedAssetModel.assetPath}/@fileasset-edit/description/edit"
|
||||||
editorId="description-editor"
|
editorId="description-editor"
|
||||||
hasUnusedLocales="#{!CmsFileAssetEditStep.unusedDescriptionLocales.isEmpty()}"
|
hasUnusedLocales="#{!CmsFileAssetEditStepModel.unusedDescriptionLocales.isEmpty()}"
|
||||||
headingLevel="3"
|
headingLevel="3"
|
||||||
objectIdentifier="#{CmsSelectedAssetModel.assetPath}"
|
objectIdentifier="#{CmsSelectedAssetModel.assetPath}"
|
||||||
readOnly="#{!MvcAssetEditStepModel.canEdit}"
|
readOnly="#{!MvcAssetEditStepModel.canEdit}"
|
||||||
|
|
@ -45,13 +45,11 @@
|
||||||
removeDialogTitle="#{CmsAssetsStepsDefaultMessagesBundle['fileasset.editstep.description.remove.title']}"
|
removeDialogTitle="#{CmsAssetsStepsDefaultMessagesBundle['fileasset.editstep.description.remove.title']}"
|
||||||
removeMethod="#{mvc.basePath}/#{ContentSectionModel.sectionName}/assets/#{CmsSelectedAssetModel.assetPath}/@fileasset-edit/description/remove"
|
removeMethod="#{mvc.basePath}/#{ContentSectionModel.sectionName}/assets/#{CmsSelectedAssetModel.assetPath}/@fileasset-edit/description/remove"
|
||||||
title="#{CmsAssetsStepsDefaultMessagesBundle['fileasset.editstep.description.title']}"
|
title="#{CmsAssetsStepsDefaultMessagesBundle['fileasset.editstep.description.title']}"
|
||||||
unusedLocales="#{CmsFileAssetEditStep.unusedDescriptionLocales}"
|
unusedLocales="#{CmsFileAssetEditStepModel.unusedDescriptionLocales}"
|
||||||
useTextarea="true"
|
useTextarea="true"
|
||||||
values="#{CmsFileAssetEditStep.descriptionValues}"
|
values="#{CmsFileAssetEditStepModel.descriptionValues}"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
</ui:define>
|
|
||||||
|
|
||||||
<h3>#{CmsAssetsStepsDefaultMessagesBundle['fileasset.editstep.file.title']}</h3>
|
<h3>#{CmsAssetsStepsDefaultMessagesBundle['fileasset.editstep.file.title']}</h3>
|
||||||
<c:if test="#{MvcAssetEditStepModel.canEdit}">
|
<c:if test="#{MvcAssetEditStepModel.canEdit}">
|
||||||
<div class="text-right">
|
<div class="text-right">
|
||||||
|
|
@ -70,7 +68,8 @@
|
||||||
tabindex="-1">
|
tabindex="-1">
|
||||||
<div class="modal-dialog">
|
<div class="modal-dialog">
|
||||||
<form action="#{mvc.basePath}/#{ContentSectionModel.sectionName}/assets/#{CmsSelectedAssetModel.assetPath}/@fileasset-edit/upload"
|
<form action="#{mvc.basePath}/#{ContentSectionModel.sectionName}/assets/#{CmsSelectedAssetModel.assetPath}/@fileasset-edit/upload"
|
||||||
enctype="multipart/formdata"
|
class="modal-content"
|
||||||
|
enctype="multipart/form-data"
|
||||||
method="post">
|
method="post">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
<h4 class="modal-title"
|
<h4 class="modal-title"
|
||||||
|
|
@ -91,6 +90,7 @@
|
||||||
inputId="fileData"
|
inputId="fileData"
|
||||||
label="#{CmsAssetsStepsDefaultMessagesBundle['fileasset.editstep.file.upload.label']}"
|
label="#{CmsAssetsStepsDefaultMessagesBundle['fileasset.editstep.file.upload.label']}"
|
||||||
name="fileData"
|
name="fileData"
|
||||||
|
required="true"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
|
|
@ -123,6 +123,8 @@
|
||||||
</div>
|
</div>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
|
</ui:define>
|
||||||
|
|
||||||
</ui:composition>
|
</ui:composition>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -207,3 +207,4 @@ fileasset.editstep.file.name=File name
|
||||||
fileasset.editstep.file.type=File Type
|
fileasset.editstep.file.type=File Type
|
||||||
fileasset.editstep.file.size=File size
|
fileasset.editstep.file.size=File size
|
||||||
editstep.legalmetadata.rights.remove.submit=Remove
|
editstep.legalmetadata.rights.remove.submit=Remove
|
||||||
|
fileasset.editstep.file.upload.label=Upload file
|
||||||
|
|
|
||||||
|
|
@ -207,3 +207,4 @@ fileasset.editstep.file.name=Dateiname
|
||||||
fileasset.editstep.file.type=Dateityp
|
fileasset.editstep.file.type=Dateityp
|
||||||
fileasset.editstep.file.size=Gr\u00f6\u00dfe der Datei
|
fileasset.editstep.file.size=Gr\u00f6\u00dfe der Datei
|
||||||
editstep.legalmetadata.rights.remove.submit=Entfernen
|
editstep.legalmetadata.rights.remove.submit=Entfernen
|
||||||
|
fileasset.editstep.file.upload.label=Datei hochladen
|
||||||
|
|
|
||||||
17
pom.xml
17
pom.xml
|
|
@ -534,6 +534,23 @@
|
||||||
<version>2.4.0-b180830.0438</version>
|
<version>2.4.0-b180830.0438</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
RESTeasy is used in Wildfly (primary target runtime) as
|
||||||
|
implementation of JAX-RS. Unfortunetly, multipart uploads are
|
||||||
|
not standardized in the JAX-RS, therefore we have to use
|
||||||
|
a vendor specific solution...
|
||||||
|
-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jboss.resteasy</groupId>
|
||||||
|
<artifactId>resteasy-core</artifactId>
|
||||||
|
<version>4.6.0.Final</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jboss.resteasy</groupId>
|
||||||
|
<artifactId>resteasy-multipart-provider</artifactId>
|
||||||
|
<version>3.14.0.Final</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Jakarta MVC is a thin layer ontop of JAX-RS providing a
|
Jakarta MVC is a thin layer ontop of JAX-RS providing a
|
||||||
MVC framework for Jakarta EE: https://www.mvc-spec.org
|
MVC framework for Jakarta EE: https://www.mvc-spec.org
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue