/*
 * 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 io.netty.channel.ChannelException;
import io.netty.handler.codec.http.HttpHeaderNames;
import io.netty.handler.codec.http.HttpHeaderValues;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;

Disk FileUpload implementation that stores file into real files
/** * Disk FileUpload implementation that stores file into real files */
public class DiskFileUpload extends AbstractDiskHttpData implements FileUpload { public static String baseDirectory; public static boolean deleteOnExitTemporaryFile = true; public static final String prefix = "FUp_"; public static final String postfix = ".tmp"; private String filename; private String contentType; private String contentTransferEncoding; public DiskFileUpload(String name, String filename, String contentType, String contentTransferEncoding, Charset charset, long size) { super(name, charset, size); setFilename(filename); setContentType(contentType); setContentTransferEncoding(contentTransferEncoding); } @Override public HttpDataType getHttpDataType() { return HttpDataType.FileUpload; } @Override public String getFilename() { return filename; } @Override public void setFilename(String filename) { if (filename == null) { throw new NullPointerException("filename"); } this.filename = filename; } @Override public int hashCode() { return FileUploadUtil.hashCode(this); } @Override public boolean equals(Object o) { return o instanceof FileUpload && FileUploadUtil.equals(this, (FileUpload) o); } @Override public int compareTo(InterfaceHttpData o) { if (!(o instanceof FileUpload)) { throw new ClassCastException("Cannot compare " + getHttpDataType() + " with " + o.getHttpDataType()); } return compareTo((FileUpload) o); } public int compareTo(FileUpload o) { return FileUploadUtil.compareTo(this, o); } @Override public void setContentType(String contentType) { if (contentType == null) { throw new NullPointerException("contentType"); } this.contentType = contentType; } @Override public String getContentType() { return contentType; } @Override public String getContentTransferEncoding() { return contentTransferEncoding; } @Override public void setContentTransferEncoding(String contentTransferEncoding) { this.contentTransferEncoding = contentTransferEncoding; } @Override public String toString() { File file = null; try { file = getFile(); } catch (IOException e) { // Should not occur. } return HttpHeaderNames.CONTENT_DISPOSITION + ": " + HttpHeaderValues.FORM_DATA + "; " + HttpHeaderValues.NAME + "=\"" + getName() + "\"; " + HttpHeaderValues.FILENAME + "=\"" + filename + "\"\r\n" + HttpHeaderNames.CONTENT_TYPE + ": " + contentType + (getCharset() != null? "; " + HttpHeaderValues.CHARSET + '=' + getCharset().name() + "\r\n" : "\r\n") + HttpHeaderNames.CONTENT_LENGTH + ": " + length() + "\r\n" + "Completed: " + isCompleted() + "\r\nIsInMemory: " + isInMemory() + "\r\nRealFile: " + (file != null ? file.getAbsolutePath() : "null") + " DefaultDeleteAfter: " + deleteOnExitTemporaryFile; } @Override protected boolean deleteOnExit() { return deleteOnExitTemporaryFile; } @Override protected String getBaseDirectory() { return baseDirectory; } @Override protected String getDiskFilename() { return "upload"; } @Override protected String getPostfix() { return postfix; } @Override protected String getPrefix() { return prefix; } @Override public FileUpload copy() { final ByteBuf content = content(); return replace(content != null ? content.copy() : null); } @Override public FileUpload duplicate() { final ByteBuf content = content(); return replace(content != null ? content.duplicate() : null); } @Override public FileUpload retainedDuplicate() { ByteBuf content = content(); if (content != null) { content = content.retainedDuplicate(); boolean success = false; try { FileUpload duplicate = replace(content); success = true; return duplicate; } finally { if (!success) { content.release(); } } } else { return replace(null); } } @Override public FileUpload replace(ByteBuf content) { DiskFileUpload upload = new DiskFileUpload( getName(), getFilename(), getContentType(), getContentTransferEncoding(), getCharset(), size); if (content != null) { try { upload.setContent(content); } catch (IOException e) { throw new ChannelException(e); } } return upload; } @Override public FileUpload retain(int increment) { super.retain(increment); return this; } @Override public FileUpload retain() { super.retain(); return this; } @Override public FileUpload touch() { super.touch(); return this; } @Override public FileUpload touch(Object hint) { super.touch(hint); return this; } }