X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fweb%2FUploadImagePage.java;h=e160c323ff20a887fa3c2edffb77bde28cd6c869;hb=9a884536fcf2d56a822b8db44bbc9ca56a61cea2;hp=17538a6b1567445415febfd0b3ab4b6a962a732b;hpb=7b2db06359747ae9638fe4d32c19efe54b62eb78;p=Sone.git
diff --git a/src/main/java/net/pterodactylus/sone/web/UploadImagePage.java b/src/main/java/net/pterodactylus/sone/web/UploadImagePage.java
index 17538a6..e160c32 100644
--- a/src/main/java/net/pterodactylus/sone/web/UploadImagePage.java
+++ b/src/main/java/net/pterodactylus/sone/web/UploadImagePage.java
@@ -18,25 +18,34 @@
package net.pterodactylus.sone.web;
import java.awt.Image;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
+import javax.imageio.ImageReader;
+import javax.imageio.stream.ImageInputStream;
import net.pterodactylus.sone.data.Album;
import net.pterodactylus.sone.data.Sone;
-import net.pterodactylus.sone.web.page.Page.Request.Method;
+import net.pterodactylus.sone.data.TemporaryImage;
+import net.pterodactylus.sone.text.TextFilter;
+import net.pterodactylus.sone.web.page.FreenetRequest;
import net.pterodactylus.util.io.Closer;
+import net.pterodactylus.util.io.StreamCopier;
import net.pterodactylus.util.logging.Logging;
import net.pterodactylus.util.template.Template;
import net.pterodactylus.util.template.TemplateContext;
+import net.pterodactylus.util.web.Method;
import freenet.support.api.Bucket;
import freenet.support.api.HTTPUploadedFile;
/**
- * TODO
+ * Page implementation that lets the user upload an image.
*
* @author David âBombeâ Roden
*/
@@ -46,10 +55,12 @@ public class UploadImagePage extends SoneTemplatePage {
private static final Logger logger = Logging.getLogger(UploadImagePage.class);
/**
- * TODO
+ * Creates a new âupload imageâ page.
*
* @param template
+ * The template to render
* @param webInterface
+ * The Sone web interface
*/
public UploadImagePage(Template template, WebInterface webInterface) {
super("uploadImage.html", template, "Page.UploadImage.Title", webInterface, true);
@@ -63,41 +74,89 @@ public class UploadImagePage extends SoneTemplatePage {
* {@inheritDoc}
*/
@Override
- protected void processTemplate(Request request, TemplateContext templateContext) throws RedirectException {
+ protected void processTemplate(FreenetRequest request, TemplateContext templateContext) throws RedirectException {
super.processTemplate(request, templateContext);
if (request.getMethod() == Method.POST) {
Sone currentSone = getCurrentSone(request.getToadletContext());
String parentId = request.getHttpRequest().getPartAsStringFailsafe("parent", 36);
Album parent = webInterface.getCore().getAlbum(parentId, false);
if (parent == null) {
- throw new RedirectException("invalid.html");
+ /* TODO - signal error */
+ return;
+ }
+ if (!currentSone.equals(parent.getSone())) {
+ /* TODO - signal error. */
+ return;
}
String name = request.getHttpRequest().getPartAsStringFailsafe("title", 200);
String description = request.getHttpRequest().getPartAsStringFailsafe("description", 4000);
HTTPUploadedFile uploadedFile = request.getHttpRequest().getUploadedFile("image");
Bucket fileBucket = uploadedFile.getData();
InputStream imageInputStream = null;
+ ByteArrayOutputStream imageDataOutputStream = null;
net.pterodactylus.sone.data.Image image = null;
try {
imageInputStream = fileBucket.getInputStream();
- Image uploadedImage = ImageIO.read(imageInputStream);
+ /* TODO - check length */
+ imageDataOutputStream = new ByteArrayOutputStream((int) fileBucket.size());
+ StreamCopier.copy(imageInputStream, imageDataOutputStream);
+ } catch (IOException ioe1) {
+ logger.log(Level.WARNING, "Could not read uploaded image!", ioe1);
+ return;
+ } finally {
+ fileBucket.free();
+ Closer.close(imageInputStream);
+ Closer.close(imageDataOutputStream);
+ }
+ byte[] imageData = imageDataOutputStream.toByteArray();
+ ByteArrayInputStream imageDataInputStream = null;
+ Image uploadedImage = null;
+ try {
+ imageDataInputStream = new ByteArrayInputStream(imageData);
+ uploadedImage = ImageIO.read(imageDataInputStream);
if (uploadedImage == null) {
templateContext.set("messages", webInterface.getL10n().getString("Page.UploadImage.Error.InvalidImage"));
return;
}
- image = new net.pterodactylus.sone.data.Image().setSone(currentSone);
- image.setTitle(name).setDescription(description).setWidth(uploadedImage.getWidth(null)).setHeight(uploadedImage.getHeight(null));
- parent.addImage(image);
- uploadedImage.flush();
+ String mimeType = getMimeType(imageData);
+ TemporaryImage temporaryImage = webInterface.getCore().createTemporaryImage(mimeType, imageData);
+ image = webInterface.getCore().createImage(currentSone, parent, temporaryImage);
+ image.setTitle(name).setDescription(TextFilter.filter(request.getHttpRequest().getHeader("host"), description)).setWidth(uploadedImage.getWidth(null)).setHeight(uploadedImage.getHeight(null));
} catch (IOException ioe1) {
logger.log(Level.WARNING, "Could not read uploaded image!", ioe1);
- throw new RedirectException("invalid.html");
+ return;
} finally {
- Closer.close(imageInputStream);
- fileBucket.free();
+ Closer.close(imageDataInputStream);
+ Closer.flush(uploadedImage);
+ }
+ throw new RedirectException("imageBrowser.html?album=" + parent.getId());
+ }
+ }
+
+ //
+ // PRIVATE METHODS
+ //
+
+ /**
+ * Tries to detect the MIME type of the encoded image.
+ *
+ * @param imageData
+ * The encoded image
+ * @return The MIME type of the image, or âapplication/octet-streamâ if the
+ * image type could not be detected
+ */
+ private String getMimeType(byte[] imageData) {
+ ByteArrayInputStream imageDataInputStream = new ByteArrayInputStream(imageData);
+ try {
+ ImageInputStream imageInputStream = ImageIO.createImageInputStream(imageDataInputStream);
+ Iterator imageReaders = ImageIO.getImageReaders(imageInputStream);
+ if (imageReaders.hasNext()) {
+ return imageReaders.next().getOriginatingProvider().getMIMETypes()[0];
}
- throw new RedirectException("imageBrowser.html?image=" + image.getId());
+ } catch (IOException ioe1) {
+ logger.log(Level.FINE, "Could not detect MIME type for image.", ioe1);
}
+ return "application/octet-stream";
}
}