/* * Copyright 2012 The Netty Project * * The Netty Project licenses this file to you under the Apache License, * version 2.0 (the "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ package io.netty.handler.codec.http.multipart; import io.netty.buffer.ByteBuf; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; /** * Mixed implementation using both in Memory and in File with a limit of size */ public class MixedFileUpload implements FileUpload { private FileUpload fileUpload; private final long limitSize; private final long definedSize; public MixedFileUpload(String name, String filename, String contentType, String contentTransferEncoding, Charset charset, long size, long limitSize) { this.limitSize = limitSize; if (size > this.limitSize) { fileUpload = new DiskFileUpload(name, filename, contentType, contentTransferEncoding, charset, size); } else { fileUpload = new MemoryFileUpload(name, filename, contentType, contentTransferEncoding, charset, size); } definedSize = size; } @Override public void addContent(ByteBuf buffer, boolean last) throws IOException { if (fileUpload instanceof MemoryFileUpload) { if (fileUpload.length() + buffer.readableBytes() > limitSize) { DiskFileUpload diskFileUpload = new DiskFileUpload(fileUpload .getName(), fileUpload.getFilename(), fileUpload .getContentType(), fileUpload .getContentTransferEncoding(), fileUpload.getCharset(), definedSize); ByteBuf data = fileUpload.getByteBuf(); if (data != null && data.isReadable()) { diskFileUpload.addContent(data.retain(), false); } // release old upload fileUpload.release(); fileUpload = diskFileUpload; } } fileUpload.addContent(buffer, last); } @Override public void delete() { fileUpload.delete(); } @Override public byte[] get() throws IOException { return fileUpload.get(); } @Override public ByteBuf getByteBuf() throws IOException { return fileUpload.getByteBuf(); } @Override public Charset getCharset() { return fileUpload.getCharset(); } @Override public String getContentType() { return fileUpload.getContentType(); } @Override public String getContentTransferEncoding() { return fileUpload.getContentTransferEncoding(); } @Override public String getFilename() { return fileUpload.getFilename(); } @Override public String getString() throws IOException { return fileUpload.getString(); } @Override public String getString(Charset encoding) throws IOException { return fileUpload.getString(encoding); } @Override public boolean isCompleted() { return fileUpload.isCompleted(); } @Override public boolean isInMemory() { return fileUpload.isInMemory(); } @Override public long length() { return fileUpload.length(); } @Override public boolean renameTo(File dest) throws IOException { return fileUpload.renameTo(dest); } @Override public void setCharset(Charset charset) { fileUpload.setCharset(charset); } @Override public void setContent(ByteBuf buffer) throws IOException { if (buffer.readableBytes() > limitSize) { if (fileUpload instanceof MemoryFileUpload) { FileUpload memoryUpload = fileUpload; // change to Disk fileUpload = new DiskFileUpload(memoryUpload .getName(), memoryUpload.getFilename(), memoryUpload .getContentType(), memoryUpload .getContentTransferEncoding(), memoryUpload.getCharset(), definedSize); // release old upload memoryUpload.release(); } } fileUpload.setContent(buffer); } @Override public void setContent(File file) throws IOException { if (file.length() > limitSize) { if (fileUpload instanceof MemoryFileUpload) { FileUpload memoryUpload = fileUpload; // change to Disk fileUpload = new DiskFileUpload(memoryUpload .getName(), memoryUpload.getFilename(), memoryUpload .getContentType(), memoryUpload .getContentTransferEncoding(), memoryUpload.getCharset(), definedSize); // release old upload memoryUpload.release(); } } fileUpload.setContent(file); } @Override public void setContent(InputStream inputStream) throws IOException { if (fileUpload instanceof MemoryFileUpload) { FileUpload memoryUpload = fileUpload; // change to Disk fileUpload = new DiskFileUpload(fileUpload .getName(), fileUpload.getFilename(), fileUpload .getContentType(), fileUpload .getContentTransferEncoding(), fileUpload.getCharset(), definedSize); // release old upload memoryUpload.release(); } fileUpload.setContent(inputStream); } @Override public void setContentType(String contentType) { fileUpload.setContentType(contentType); } @Override public void setContentTransferEncoding(String contentTransferEncoding) { fileUpload.setContentTransferEncoding(contentTransferEncoding); } @Override public void setFilename(String filename) { fileUpload.setFilename(filename); } @Override public HttpDataType getHttpDataType() { return fileUpload.getHttpDataType(); } @Override public String getName() { return fileUpload.getName(); } @Override public int compareTo(InterfaceHttpData o) { return fileUpload.compareTo(o); } @Override public String toString() { return "Mixed: " + fileUpload.toString(); } @Override public ByteBuf getChunk(int length) throws IOException { return fileUpload.getChunk(length); } @Override public File getFile() throws IOException { return fileUpload.getFile(); } @Override public FileUpload copy() { return fileUpload.copy(); } @Override public FileUpload duplicate() { return fileUpload.duplicate(); } @Override public ByteBuf content() { return fileUpload.content(); } @Override public int refCnt() { return fileUpload.refCnt(); } @Override public FileUpload retain() { fileUpload.retain(); return this; } @Override public FileUpload retain(int increment) { fileUpload.retain(increment); return this; } @Override public boolean release() { return fileUpload.release(); } @Override public boolean release(int decrement) { return fileUpload.release(decrement); } }