1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.commons.fileupload;
18
19 import java.io.File;
20 import java.io.IOException;
21 import java.io.InputStream;
22 import java.io.OutputStream;
23 import java.io.Serializable;
24 import java.io.UnsupportedEncodingException;
25
26 /**
27 * <p> This class represents a file or form item that was received within a
28 * <code>multipart/form-data</code> POST request.
29 *
30 * <p> After retrieving an instance of this class from a {@link
31 * org.apache.commons.fileupload.FileUpload FileUpload} instance (see
32 * {@link org.apache.commons.fileupload.FileUpload
33 * #parseRequest(javax.servlet.http.HttpServletRequest)}), you may
34 * either request all contents of the file at once using {@link #get()} or
35 * request an {@link java.io.InputStream InputStream} with
36 * {@link #getInputStream()} and process the file without attempting to load
37 * it into memory, which may come handy with large files.
38 *
39 * <p> While this interface does not extend
40 * <code>javax.activation.DataSource</code> per se (to avoid a seldom used
41 * dependency), several of the defined methods are specifically defined with
42 * the same signatures as methods in that interface. This allows an
43 * implementation of this interface to also implement
44 * <code>javax.activation.DataSource</code> with minimal additional work.
45 *
46 * @author <a href="mailto:Rafal.Krzewski@e-point.pl">Rafal Krzewski</a>
47 * @author <a href="mailto:sean@informage.net">Sean Legassick</a>
48 * @author <a href="mailto:jvanzyl@apache.org">Jason van Zyl</a>
49 * @author <a href="mailto:martinc@apache.org">Martin Cooper</a>
50 *
51 * @version $Id: FileItem.java 578253 2007-09-21 20:13:14Z jochen $
52 */
53 public interface FileItem extends Serializable {
54
55
56 // ------------------------------- Methods from javax.activation.DataSource
57
58
59 /**
60 * Returns an {@link java.io.InputStream InputStream} that can be
61 * used to retrieve the contents of the file.
62 *
63 * @return An {@link java.io.InputStream InputStream} that can be
64 * used to retrieve the contents of the file.
65 *
66 * @throws IOException if an error occurs.
67 */
68 InputStream getInputStream() throws IOException;
69
70
71 /**
72 * Returns the content type passed by the browser or <code>null</code> if
73 * not defined.
74 *
75 * @return The content type passed by the browser or <code>null</code> if
76 * not defined.
77 */
78 String getContentType();
79
80
81 /**
82 * Returns the original filename in the client's filesystem, as provided by
83 * the browser (or other client software). In most cases, this will be the
84 * base file name, without path information. However, some clients, such as
85 * the Opera browser, do include path information.
86 *
87 * @return The original filename in the client's filesystem.
88 */
89 String getName();
90
91
92 // ------------------------------------------------------- FileItem methods
93
94
95 /**
96 * Provides a hint as to whether or not the file contents will be read
97 * from memory.
98 *
99 * @return <code>true</code> if the file contents will be read from memory;
100 * <code>false</code> otherwise.
101 */
102 boolean isInMemory();
103
104
105 /**
106 * Returns the size of the file item.
107 *
108 * @return The size of the file item, in bytes.
109 */
110 long getSize();
111
112
113 /**
114 * Returns the contents of the file item as an array of bytes.
115 *
116 * @return The contents of the file item as an array of bytes.
117 */
118 byte[] get();
119
120
121 /**
122 * Returns the contents of the file item as a String, using the specified
123 * encoding. This method uses {@link #get()} to retrieve the
124 * contents of the item.
125 *
126 * @param encoding The character encoding to use.
127 *
128 * @return The contents of the item, as a string.
129 *
130 * @throws UnsupportedEncodingException if the requested character
131 * encoding is not available.
132 */
133 String getString(String encoding) throws UnsupportedEncodingException;
134
135
136 /**
137 * Returns the contents of the file item as a String, using the default
138 * character encoding. This method uses {@link #get()} to retrieve the
139 * contents of the item.
140 *
141 * @return The contents of the item, as a string.
142 */
143 String getString();
144
145
146 /**
147 * A convenience method to write an uploaded item to disk. The client code
148 * is not concerned with whether or not the item is stored in memory, or on
149 * disk in a temporary location. They just want to write the uploaded item
150 * to a file.
151 * <p>
152 * This method is not guaranteed to succeed if called more than once for
153 * the same item. This allows a particular implementation to use, for
154 * example, file renaming, where possible, rather than copying all of the
155 * underlying data, thus gaining a significant performance benefit.
156 *
157 * @param file The <code>File</code> into which the uploaded item should
158 * be stored.
159 *
160 * @throws Exception if an error occurs.
161 */
162 void write(File file) throws Exception;
163
164
165 /**
166 * Deletes the underlying storage for a file item, including deleting any
167 * associated temporary disk file. Although this storage will be deleted
168 * automatically when the <code>FileItem</code> instance is garbage
169 * collected, this method can be used to ensure that this is done at an
170 * earlier time, thus preserving system resources.
171 */
172 void delete();
173
174
175 /**
176 * Returns the name of the field in the multipart form corresponding to
177 * this file item.
178 *
179 * @return The name of the form field.
180 */
181 String getFieldName();
182
183
184 /**
185 * Sets the field name used to reference this file item.
186 *
187 * @param name The name of the form field.
188 */
189 void setFieldName(String name);
190
191
192 /**
193 * Determines whether or not a <code>FileItem</code> instance represents
194 * a simple form field.
195 *
196 * @return <code>true</code> if the instance represents a simple form
197 * field; <code>false</code> if it represents an uploaded file.
198 */
199 boolean isFormField();
200
201
202 /**
203 * Specifies whether or not a <code>FileItem</code> instance represents
204 * a simple form field.
205 *
206 * @param state <code>true</code> if the instance represents a simple form
207 * field; <code>false</code> if it represents an uploaded file.
208 */
209 void setFormField(boolean state);
210
211
212 /**
213 * Returns an {@link java.io.OutputStream OutputStream} that can
214 * be used for storing the contents of the file.
215 *
216 * @return An {@link java.io.OutputStream OutputStream} that can be used
217 * for storing the contensts of the file.
218 *
219 * @throws IOException if an error occurs.
220 */
221 OutputStream getOutputStream() throws IOException;
222
223 }