diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/AbstractBinaryAssetFormController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/AbstractBinaryAssetFormController.java index 54845725c..a2119c10a 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/AbstractBinaryAssetFormController.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/AbstractBinaryAssetFormController.java @@ -87,7 +87,7 @@ public abstract class AbstractBinaryAssetFormController } if (data.containsKey(DATA)) { - asset.setData((byte[]) data.get(DATA)); + //asset.setData((byte[]) data.get(DATA)); } if (data.containsKey(SIZE)) { diff --git a/ccm-cms/src/main/java/org/librecms/assets/BinaryAsset.java b/ccm-cms/src/main/java/org/librecms/assets/BinaryAsset.java index 147b3e839..1c318f58b 100644 --- a/ccm-cms/src/main/java/org/librecms/assets/BinaryAsset.java +++ b/ccm-cms/src/main/java/org/librecms/assets/BinaryAsset.java @@ -35,9 +35,16 @@ import javax.persistence.Lob; import javax.persistence.Table; import org.hibernate.envers.Audited; +import org.hibernate.envers.NotAudited; +import org.libreccm.core.UnexpectedErrorException; import org.libreccm.jpa.utils.MimeTypeConverter; import org.libreccm.l10n.LocalizedString; +import java.io.InputStream; +import java.io.OutputStream; +import java.sql.Blob; +import java.sql.SQLException; + import javax.persistence.Basic; import javax.persistence.Convert; import javax.persistence.FetchType; @@ -79,7 +86,9 @@ public class BinaryAsset extends Asset implements Serializable { @Column(name = "ASSET_DATA") @Lob @Basic(fetch = FetchType.LAZY) - private byte[] data; + @NotAudited +// private byte[] data; + private Blob data; @Column(name = "DATA_SIZE") private long size; @@ -87,7 +96,7 @@ public class BinaryAsset extends Asset implements Serializable { public BinaryAsset() { super(); description = new LocalizedString(); - data = new byte[]{}; + //data = new byte[]{}; } public LocalizedString getDescription() { @@ -115,21 +124,52 @@ public class BinaryAsset extends Asset implements Serializable { this.mimeType = mimeType; } - public byte[] getData() { - if (data == null) { - return new byte[]{}; - } else { - return Arrays.copyOf(data, data.length); +// public byte[] getData() { +// if (data == null) { +// return new byte[]{}; +// } else { +// return Arrays.copyOf(data, data.length); +// } +// } +// +// public void setData(final byte[] data) { +// if (data == null) { +// this.data = new byte[]{}; +// size = this.data.length; +// } else { +// this.data = Arrays.copyOf(data, data.length); +// size = data.length; +// } +// } + public Blob getData() { + return data; + } + + public long getDataSize() { + try { + return data.length(); + } catch(SQLException ex) { + throw new UnexpectedErrorException(ex); } } - public void setData(final byte[] data) { - if (data == null) { - this.data = new byte[]{}; - size = this.data.length; - } else { - this.data = Arrays.copyOf(data, data.length); - size = data.length; + public InputStream getDataAsInputStream() { + try { + return data.getBinaryStream(); + } catch (SQLException ex) { + throw new UnexpectedErrorException(ex); + } + } + + public void setData(final Blob data) { + this.data = data; + } + + public OutputStream getDataOutputStream() { + try { + return data.setBinaryStream(0); + } catch (SQLException ex) { + throw new UnexpectedErrorException(ex); } } @@ -147,7 +187,7 @@ public class BinaryAsset extends Asset implements Serializable { hash = 59 * hash + Objects.hashCode(description); hash = 59 * hash + Objects.hashCode(fileName); hash = 59 * hash + Objects.hashCode(mimeType); - hash = 59 * hash + Arrays.hashCode(data); + hash = 59 * hash + Objects.hashCode(data); hash = 59 * hash + (int) (size ^ (size >>> 32)); return hash; } @@ -183,7 +223,7 @@ public class BinaryAsset extends Asset implements Serializable { if (!Objects.equals(mimeType, other.getMimeType())) { return false; } - return Arrays.equals(data, other.getData()); + return Objects.equals(data, other.getData()); } @Override diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/rs/Images.java b/ccm-cms/src/main/java/org/librecms/contentsection/rs/Images.java index e1c2f6ca1..b2558039c 100644 --- a/ccm-cms/src/main/java/org/librecms/contentsection/rs/Images.java +++ b/ccm-cms/src/main/java/org/librecms/contentsection/rs/Images.java @@ -257,10 +257,11 @@ public class Images { final String widthParam, final String heightParam) { - final byte[] data = image.getData(); + //final byte[] data = image.getData(); final String mimeType = image.getMimeType().toString(); - final InputStream inputStream = new ByteArrayInputStream(data); + //final InputStream inputStream = new ByteArrayInputStream(data); + final InputStream inputStream = image.getDataAsInputStream(); final BufferedImage bufferedImage; final String imageFormat; try { @@ -334,10 +335,11 @@ public class Images { */ private Response readImageProperties(final Image image) { - final byte[] data = image.getData(); + //final byte[] data = image.getData(); final String mimeType = image.getMimeType().toString(); - final InputStream inputStream = new ByteArrayInputStream(data); + //final InputStream inputStream = new ByteArrayInputStream(data); + final InputStream inputStream = image.getDataAsInputStream(); final BufferedImage bufferedImage; try { bufferedImage = ImageIO.read(inputStream); diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/rs/ImagesPropertiesProvider.java b/ccm-cms/src/main/java/org/librecms/contentsection/rs/ImagesPropertiesProvider.java index 4f77e1f19..72126fbe1 100644 --- a/ccm-cms/src/main/java/org/librecms/contentsection/rs/ImagesPropertiesProvider.java +++ b/ccm-cms/src/main/java/org/librecms/contentsection/rs/ImagesPropertiesProvider.java @@ -55,8 +55,9 @@ public class ImagesPropertiesProvider implements AssetPropertiesProvider { } final Image image = (Image) asset; - final byte[] data = image.getData(); - final InputStream inputStream = new ByteArrayInputStream(data); +// final byte[] data = image.getData(); +// final InputStream inputStream = new ByteArrayInputStream(data); + final InputStream inputStream = image.getDataAsInputStream(); final BufferedImage bufferedImage; try { bufferedImage = ImageIO.read(inputStream); @@ -70,7 +71,8 @@ public class ImagesPropertiesProvider implements AssetPropertiesProvider { .add("mimetype", image.getMimeType().toString()) .add("width", bufferedImage.getWidth()) .add("height", bufferedImage.getHeight()) - .add("size", data.length); + .add("size", image.getDataSize()); +// .add("size", data.length); } } diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/FileAssetEditStep.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/FileAssetEditStep.java index cc5336e1e..0bee5c9cb 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/FileAssetEditStep.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/FileAssetEditStep.java @@ -20,6 +20,7 @@ package org.librecms.ui.contentsections.assets; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.hibernate.engine.jdbc.BlobProxy; import org.jboss.resteasy.plugins.providers.multipart.InputPart; import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput; import org.libreccm.core.UnexpectedErrorException; @@ -31,8 +32,12 @@ import org.librecms.contentsection.AssetRepository; import org.librecms.ui.contentsections.AssetPermissionsChecker; import org.librecms.ui.contentsections.ContentSectionNotFoundException; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; +import java.sql.Blob; import java.util.List; import java.util.Locale; import java.util.Map; @@ -46,7 +51,6 @@ import javax.enterprise.context.RequestScoped; import javax.inject.Inject; import javax.mvc.Controller; import javax.mvc.Models; -import javax.servlet.http.Part; import javax.transaction.Transactional; import javax.ws.rs.Consumes; import javax.ws.rs.FormParam; @@ -56,7 +60,6 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.core.Response; /** * @@ -353,34 +356,66 @@ public class FileAssetEditStep extends AbstractMvcAssetEditStep { .getHeaders(); fileName = getFileName(headers); contentType = getContentType(headers); - fileSize = getFileSize(headers); +// fileSize = getFileSize(headers); -// fileAsset.setFileName(fileName); -// //fileAsset.setSize(fileAsset.getData().length); -// try { -// fileAsset.setMimeType(new MimeType(contentType)); -// } catch (MimeTypeParseException ex) { -// LOGGER.error( -// "Failed to upload file for FileAsset {}:", assetPath -// ); -// LOGGER.error(ex); -// -// models.put("uploadFailed", true); -// return buildRedirectPathForStep(); -// } -// -// assetRepo.save(fileAsset); - try ( InputStream inputStream = inputPart.getBody( - InputStream.class, null)) { - dataService.saveData( - fileAsset, - inputStream, - fileName, - contentType, - fileSize + final java.nio.file.Path tmpFilePath = Files + .createTempFile( + "upload", fileName ); + try ( InputStream inputStream = inputPart.getBody( + InputStream.class, null + )) { + try ( OutputStream outputStream = Files.newOutputStream( + tmpFilePath + )) { + int length; + byte[] buffer = new byte[8192]; + while ((length = inputStream.read(buffer)) != -1) { + outputStream.write(buffer); + fileSize += length; + } + outputStream.flush(); + } } +// try ( InputStream fileInputStream = Files.newInputStream( +// tmpFilePath +// )) { + + final Blob data = BlobProxy.generateProxy( + Files.newInputStream(tmpFilePath), -1 + ); + fileAsset.setFileName(fileName); + fileAsset.setData(data); + + fileAsset.setSize(fileSize); +// fileAsset.setSize(fileAsset.getData().length); + try { + fileAsset.setMimeType(new MimeType(contentType)); + } catch (MimeTypeParseException ex) { + LOGGER.error( + "Failed to upload file for FileAsset {}:", + assetPath + ); + LOGGER.error(ex); + + models.put("uploadFailed", true); + return buildRedirectPathForStep(); + } + + assetRepo.save(fileAsset); +// } +// try ( InputStream inputStream = inputPart.getBody( +// InputStream.class, null)) { +// dataService.saveData( +// fileAsset, +// inputStream, +// fileName, +// contentType, +// fileSize +// ); +// } + } catch (IOException ex) { LOGGER.error( "Failed to upload file for FileAsset {}:", assetPath @@ -399,6 +434,7 @@ public class FileAssetEditStep extends AbstractMvcAssetEditStep { getAsset(), messageBundle.get("asset.edit.denied")); } + } private String getFileName(final MultivaluedMap headers) {