1 //
2 // $Id: UploadPolicy.java 287 2007-06-17 09:07:04 +0000 (dim., 17 juin 2007)
3 // felfert $
4 //
5 // jupload - A file upload applet.
6 // Copyright 2007 The JUpload Team
7 //
8 // Created: 2006-05-04
9 // Creator: etienne_sf
10 // Last modified: $Date: 2015-03-15 14:50:53 +0100 (dim., 15 mars 2015) $
11 //
12 // This program is free software; you can redistribute it and/or modify it under
13 // the terms of the GNU General Public License as published by the Free Software
14 // Foundation; either version 2 of the License, or (at your option) any later
15 // version. This program is distributed in the hope that it will be useful, but
16 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
18 // details. You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the Free Software Foundation, Inc.,
20 // 675 Mass Ave, Cambridge, MA 02139, USA.
21
22 package wjhk.jupload2.policies;
23
24 import java.awt.Cursor;
25 import java.awt.dnd.DropTargetDropEvent;
26 import java.io.File;
27 import java.util.Locale;
28
29 import javax.swing.Icon;
30 import javax.swing.JButton;
31 import javax.swing.JLabel;
32 import javax.swing.JOptionPane;
33 import javax.swing.JPanel;
34 import javax.swing.JProgressBar;
35 import javax.swing.filechooser.FileFilter;
36
37 import wjhk.jupload2.context.JUploadContext;
38 import wjhk.jupload2.exception.JUploadException;
39 import wjhk.jupload2.exception.JUploadExceptionStopAddingFiles;
40 import wjhk.jupload2.exception.JUploadIOException;
41 import wjhk.jupload2.filedata.FileData;
42 import wjhk.jupload2.gui.JUploadFileChooser;
43 import wjhk.jupload2.gui.JUploadFileFilter;
44 import wjhk.jupload2.gui.JUploadFileView;
45 import wjhk.jupload2.gui.JUploadPanel;
46 import wjhk.jupload2.gui.filepanel.FilePanel;
47 import wjhk.jupload2.gui.image.PictureDialog;
48 import wjhk.jupload2.upload.helper.ByteArrayEncoder;
49
50 /**
51 * This package contains upload policies, which allow easy configuration of the applet behavior. <br>
52 * <br>
53 * The class {@link DefaultUploadPolicy} contains a default implementation for all UploadPolicy methods. <br>
54 * <br>
55 * <h4><a name="parameters">Parameters</a></h4> <!-- ATTENTION: The following comment is used by Ant build. DO NOT
56 * CHANGE!! --> <!-- ANT_COPYDOC_START -->
57 * <p>
58 * Here is the list of all parameters available in the current package, that is: available in available upload policies.
59 * These are applet parameters that can be 'given' to the applet, with <PARAM> tags, as explained below in the <a
60 * href="#example">example</a>.
61 * </p>
62 * <P>
63 * Let's start with some hints: <DIR>
64 * <LI><A href="debugLevel">debugLevel</A> and <A href="showLogWindow">showLogWindow</A>: I recommend putting debugLevel
65 * to 99 and showLogWindow to onError.
66 * <LI><A href="maxFileSize">maxFileSize</A>: this prevents the user to upload too big files. The value depends on your
67 * needs.
68 * <LI><A href="#maxChunkSize">maxChunkSize</A>: allows you to override the server's maximum upload file size. The
69 * uploaded file will be split in pieces of maxChunkSize bytes. Then, it's up to you to concatenate the file pieces,
70 * into a server script. There are sample in this doc, and in the JUpload wiki. Please add your samples also...</DIR>
71 * </P>
72 * <table border="1">
73 * <tr>
74 * <th>Parameter name</th>
75 * <th>Default value / <br>
76 * Implemented in</th>
77 * <th>Description</th>
78 * </tr>
79 * <tr>
80 * <td>afterUploadTarget<br>
81 * Since 2.9.2rc4</td>
82 * <td>_self<br>
83 * <br>
84 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
85 * <td>This parameter allows to select a specific target frame when redirecting to <code>afterUploadURL</code>. The
86 * following values are possible:<br>
87 * <ul>
88 * <li><code>_self</code> - Show in the window and frame that contain the applet.</li>
89 * <li><code>_parent</code> - Show in the applet's parent frame. If the applet's frame has no parent frame, acts the
90 * same as <i>_self</i>.</li>
91 * <li><code>_top</code> - Show in the top-level frame of the applet's window. If the applet's frame is the top-level
92 * frame, acts the same as <i>_self</i>.</li>
93 * <li><code>_blank</code> - Show in a new, unnamed top-level window.
94 * <li><i>name</i> - Show in the frame or window named <i>name</i>. If a target named <i>name</i> does not already
95 * exist, a new top-level window with the specified name is created, and the document is shown there.</li>
96 * </ul>
97 * See also: {@link java.applet.AppletContext#showDocument(java.net.URL, java.lang.String)}</td>
98 * </tr>
99 * <tr>
100 * <td>afterUploadURL</td>
101 * <td><i>null</i><br>
102 * since 2.9.0<br>
103 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
104 * <td>This parameter is used by all policies. It allows the applet to change the current page to another one after a
105 * successful upload. <br>
106 * This allows, for instance, to display a page containing the file description of the newly uploaded page. Since
107 * version 3.0.2b2, you can specify a JavaScript expression instead of a plain URL. So afterUploadURL can now contain:<br>
108 * <UL>
109 * <LI><B>A javascript expression</B>: The URL must start by <I>javascript:</I>. See below for details.</LI>
110 * <LI><B>A http URL</B>: the navigator will open this URL, in the current page or another, according to the
111 * <I>afterUploadTarget</I> parameter. Any URL that doesn't start by <I>javascript:</I> is handled as an http URL.</LI>
112 * </UL>
113 * If the value of afterUploadURL starts with the string "javascript:", the remainder of the string is evaluated as
114 * JavaScript expression in the current document context. For example: If afterUloadURL is<br>
115 * <code>"javascript:alert('Thanks for the upload');"</code>,</br> then after a successful upload, a messagebox would
116 * pop up. Since 3.0.2b3 there are now three place holders available which can be used as parameters in function calls:
117 * <ul>
118 * <li><code>%success%</code> is replaced by <b>true</b> or <b>false</b> depending on upload success.
119 * <li><code>%msg%</code> is replaced by an unquoted string, containing the error message received from the server (if
120 * any). Inside that string, all occurrences of the single-quote character (hex 27) are quoted by backslashes.
121 * <li><code>%body%</code> is replaced by an unquoted string, containing the complete response body. Inside that string,
122 * all occurrences of the single-quote character (hex 27) are quoted by backslashes.
123 * </ul>
124 * So if you set afterUloadURL to <code>"javascript:alert('%body%');"</code>, then the resulting message box will show
125 * the body content of the last server response.</td>
126 * </tr>
127 * <tr>
128 * <td>albumId</td>
129 * <td>-1 <br>
130 * <br>
131 * {@link wjhk.jupload2.policies.CoppermineUploadPolicy}</td>
132 * <td>This parameter is only used by CoppermineUploadPolicy. So it is to be used to upload into a <a
133 * href="http://coppermine.sourceforge.net/">coppermine picture gallery</a>. This parameter contains the identifier of
134 * the album, where pictures should be used. See CoppermineUploadPolicy for an example. <br>
135 * Before upload, CoppermineUploadPolicy. {@link wjhk.jupload2.policies.CoppermineUploadPolicy#beforeUpload()} checks
136 * that the albumId is correct, that is: >=1.</td>
137 * </tr>
138 * <tr>
139 * <td>allowedFileExtensions</td>
140 * <td><i>empty string</i><br>
141 * since 2.9.0<br>
142 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
143 * <td>This parameter allows the caller to specify a list of file extension. If this parameter is specified, only file
144 * with this extension can be selected in the applet.<br>
145 * This parameter must contains a list of extensions, in lower case, separated by slashes. eg: jpg/jpeg/gif</td>
146 * </tr>
147 * <tr>
148 * <td>allowHttpPersistent</td>
149 * <td><i>false</i><br>
150 * since 3.0.0rc1<br>
151 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
152 * <td>This parameter allows to switch off persistent HTTP connections which are enabled by default (and the protocol
153 * version allows it). Currently, we encountered problems with persistent connections when testing on a windows box
154 * using a loopback interface only. <BR>
155 * Note: default value changed to false in 4.0 version.</td>
156 * </tr>
157 * <tr>
158 * <td>browsingDirectory</td>
159 * <td><i>null</i><br>
160 * since 4.0.0b2<br>
161 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
162 * <td>This parameter allows to control the starting browsing directory, that is, the directory the is the current one
163 * when the file chooser is open.<BR>
164 * <U>Notes:</U> <DIR>
165 * <UL>
166 * If the directory doesn't exist, or can not be read, a warning is written on the local log window (visible only in
167 * debug mode), and this parameter is ignored.
168 * <UL>
169 * This directory may begin with ~/ or ~\, to have a path set relative to the current user's home.</DIR></td>
170 * </tr>
171 * <tr>
172 * <td>debugLevel</td>
173 * <td>0 <br>
174 * <br>
175 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
176 * <td>With 0, you get the normal production output. The higher the number is, the more information is displayed in the
177 * log window. Here are some hints about debug level values (please note that this is indicative ... including for me,
178 * as I'me writing this during 3.3.2 release: <DIR>
179 * <LI>0: No debug output. Only INFO and ERROR
180 * <LI>10: Structural debug output (entering method, exception info...)
181 * <LI>30: Details about method parameters
182 * <LI>50: Details about internal method variables.
183 * <LI>70: Details about encoding toward the server
184 * <LI>80: Details about server's response
185 * <LI>90: Details about query and server response when sending debug output to urlToSendErrorTo
186 * <LI>100: Maximum output information level. The redirection toward afterUploadURL is blocked
187 * <LI>>100: Additional things for internal debug, like some wait in the code to check what messages the applet
188 * displays, while uploading small files on localhost.</DIR> <br>
189 * Note: All debug messages are stored in a temporary log file. This can be used to display more information, if needed.
190 * See also the <I>urlToSendErrorTo</I> applet parameter.</td>
191 * </tr>
192 * <tr>
193 * <td>fileChooserIconFromFileContent</td>
194 * <td><i>0</i><br>
195 * since 3.1.0b<br>
196 * {@link wjhk.jupload2.policies.UploadPolicy}</td>
197 * <td>This parameter allows to control whether the file icons in the file chooser are calculated from the file content.
198 * This is currently only available for pictures.<BR>
199 * If activated, the file chooser will open each pictures, and calculate the icon by resizing the picture. This is done
200 * in by using thread of minimam priority, to minimize performances impact on the navigator. Available values are: <DIR>
201 * <LI>-1: disabled. The default system are used.
202 * <LI>0 (default): available only in picture mode. That is: the current upload policy is an instance of or a class
203 * inheriting from {@link PictureUploadPolicy}
204 * <LI>1: available for all upload policies. </DIR></td>
205 * </tr>
206 * <tr>
207 * <td>fileChooserIconSize</td>
208 * <td><i>20</i><br>
209 * since 3.1.0b<br>
210 * {@link wjhk.jupload2.policies.UploadPolicy}</td>
211 * <td>This parameter allows to control the size of icons, in pixels, in the file chooser. Used only when
212 * fileChooserIconFromFileContent is activated.<BR>
213 * Note: The standard icon size is a value of 20. With 50, you'll get a better view of the picture.</td>
214 * </tr>
215 * <tr>
216 * <td>fileChooserImagePreview</td>
217 * <td><i>true</i><br>
218 * since 3.1.0b<br>
219 * {@link wjhk.jupload2.policies.PictureUploadPolicy}</td>
220 * <td>This parameter allows to control whether an preview is available for picture in the file chooser. If activated,
221 * the file chooser will open the preview in a separate thread, of high priority. This avoid blocking the applet while
222 * calculating the preview picture, when the user just double-clicked a picture file. This parameter is ignored for
223 * DefaultUploadPolicy.
224 * </tr>
225 * <tr>
226 * <tr>
227 * <td>fileFilterName</td>
228 * <td><i>null</i><br>
229 * since 5.0.0</td> Contains the name of the file filter, as it will be displayed in the drop down list of filters, in
230 * the file chooser. If this name is given to the applet, it will be returned by the {@link FileFilter#getDescription()}
231 * method. <BR>
232 * Default value for applet parameter "fileFilterName". This default value let the {@link DefaultUploadPolicy} return a
233 * calculated name, which contains the list of allowed file extensions.<BR>
234 * Note: this parameter is ignored, if there is no file filter, that is, if the allowedFileExtensions applet parameter
235 * is not used.
236 * <td>
237 * </tr>
238 * <tr>
239 * <td>fileListViewMode</td>
240 * <td><i>flat mode</i><br/>
241 * Since 6.0.0 <br/>
242 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
243 * <td>This parameter can take these values:
244 * <UL>
245 * <LI><B>flat</B>: (all files are listed in a standard table)</LI>
246 * <LI><B>tree_view</B>: in this mode (new in 6.0.0), the file hierarchy is displayed as it will be uploaded. The data
247 * structure maps to File System mode. That is: the shown hierarchy is a part of the local file system. The root of the
248 * hierarchy (visible root) is the common root to to all files and folder. It is actually a <B>hierarchical view of the
249 * FLAT view</B>, using the same data structure. Only the display changes.<BR/>
250 * For instance, if /tmp/f1/f2/file.txt and /tmp/f1/f11/file.txt have been added, /tmp/f1 is the common root. So this
251 * mode displays: f2 and f11 as the first visible hierarchy level. f2 contains file.txt, and f11 also contains a
252 * file.txt file.</LI>
253 * <LI><B>independent_tree_view</B>: In independent tree view mode, each added file/folder is added to the root. This
254 * root is the root that will be sent to the server, during the upload.<BR/>
255 * For instance, if /tmp/f1/f2/file.txt and /tmp/f1/f11/file.txt have been both added, then, two file.txt (coming from
256 * different folders, so they are actually different files with the same name) are attached to the hierarchical view.<BR/>
257 * If if /tmp/f1 is added, then: f1 is attached to the root. And the hierarchy will contain: f1, f2 as a subfolder of
258 * f1, file.txt as a file in f2.</LI>
259 * </UL>
260 * </td>
261 * </tr>
262 * <tr>
263 * <td><s>filenameEncoding</s></td>
264 * <td><S><i>null</i></S><br>
265 * <br>
266 * <S>{@link wjhk.jupload2.policies.DefaultUploadPolicy}</S></td>
267 * <td>Since 3.3.0, this parameter is no more used. The full applet upload HTTP request to the server is now correctly
268 * encoded.<BR>
269 * <S>With null, the filename in the <i>Content-Disposition</i> header is not encoded. If not null, the applet tries to
270 * encode this filename with the given encoding. It's up to the receiver (the web site) to decode this encoding (see
271 * {@link #getUploadFilename(FileData, int)}. <br>
272 * Example: if the "UTF8" encoding is chosen, the PHP function urldecode can be used to decode the filename. </S></td>
273 * </tr>
274 * <tr>
275 * <tr>
276 * <td>formdata</td>
277 * <td><i>null</i><br>
278 * <br>
279 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}<br>
280 * <i>Since 2.9.2rc4</i></td>
281 * <td>With this parameter, the name of a HTML form can be specified. If the specified form exists in the same document
282 * like the applet, all all form-variables are added as POST parameters to the applet's POST request.<BR>
283 * <B>Note:</B> Whatever value is in the <U>httpUploadParameterType</U> applet parameter, these parameters with the name
284 * of the given input in the form. That is: if you have an input text named 'myText', there will be one myText parameter
285 * in the HTTP upload request, with the text/plain mime type, and whose value is the content of this field, in the form.
286 * </td>
287 * </tr>
288 * <tr>
289 * <td>ftpCreateDirectoryStructure</td>
290 * <td><i>false</i><br>
291 * since 4.2.0<br>
292 * {@link wjhk.jupload2.policies.UploadPolicy}</td>
293 * <td>This parameter allows to control whether the directory structure on the client side must be created on the server
294 * side.<BR>
295 * Example: if the user upload the test/ directory, which contains the readme.txt file. With
296 * <I>ftpCreateDirectoryStructure</I> to false (or default value), the readme.txt is uploaded in the postURL directory.
297 * If set to true, the test/ folder is created as a subfolder of the path given in the postURL directory, and the
298 * readme.txt is uploaded in this subfolder.<BR>
299 * Note: in HTTP upload, the pathinfo and relpathinfo allows the server side script to manage this directory structure.</td>
300 * </tr>
301 * <tr>
302 * <td>ftpTransfertBinary</td>
303 * <td><i>true</i><br>
304 * since 4.1.0<br>
305 * {@link wjhk.jupload2.policies.UploadPolicy}</td>
306 * <td>This parameter allows to control whether the upload should be done in binary or ascii mode. Default is to upload
307 * in binary mode.</td>
308 * </tr>
309 * <tr>
310 * <td>ftpTransfertPassive</td>
311 * <td><i>true</i><br>
312 * since 4.1.0<br>
313 * {@link wjhk.jupload2.policies.UploadPolicy}</td>
314 * <td>This parameter allows to control whether the upload should be done in FTP passive mode, or in active mode (where
315 * the FTP server opens a connection to the client, to do the upload). Default passive mode.</td>
316 * </tr>
317 * <tr>
318 * <td>highQualityPreview</td>
319 * <td>false<br>
320 * <br>
321 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
322 * <td>If this parameter is set to <i>true</i>, the applet will call the BufferedImage.getScaledInstance(), instead of
323 * doing a basic scale transformation. This consume more CPU: on a PII 500MHz, the full screen go from around 5 seconds
324 * to between 12 and 20 seconds, for a picture created by my EOS20D (8,5M pixels). The standard preview (above the file
325 * list) seem to be displayed at the same speed, whatever is the value of this parameter. <br>
326 * Note: when resizing is done before upload, the BufferedImage.getScaledInstance() is always called, so that the
327 * uploaded picture is of the best available quality.</td>
328 * </tr>
329 * <tr>
330 * <td>httpUploadParameterName</td>
331 * <td>File<br>
332 * <br>
333 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}<BR>
334 * since 4.5.0</td>
335 * <td>Contains the parameter name, that will be used to send the file in the HTTP upload request. The default value
336 * (File), associated with the default value for httpUploadParameterType (see below), makes all file be uploaded with
337 * name from File0 to FileN (when there are N+1 file to upload).<BR>
338 * Put another value, of your server part script need a particular parameter name to work properly.<BR>
339 * Note: valid characters for this parameter are: first letter (letter or number), next letters (letter, number or
340 * underscore)</td>
341 * </tr>
342 * <tr>
343 * <td>httpUploadParameterType</td>
344 * <td>iteration<br>
345 * <br>
346 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}<BR>
347 * since 4.5.0</td>
348 * <td>Allowed values are: <DIR>
349 * <LI><B>iteration</B>: Used to have the attribute property that actually contains the file be named File0 to FileN (if
350 * you have N+1 uploaded files). This is the default behavior. In this case, your server script should look for POST
351 * properties, named 'File0' to 'FileN'</LI>
352 * <LI><B>array</B>: Used if your server script want to receive one array, that will contain all uploaded files.</LI>
353 * <LI><B>oneFile</B>: Indicates that, in the HTTP upload request, there will be only one file. This value is only valid
354 * when nbFilesPerRequest is 1. The parameters in the HTTP upload request are let untransformed. For instance, if
355 * httpUploadParameterName is the default value (File), the file content will be loaded under the HTTP parameter 'File'
356 * (not File0 or File[]).</LI></DIR><BR>
357 * <B>Note:</B> All parameters common to all pictures are sent directly. For instance, if toto is given on the URL, the
358 * toto parameter is sent as is (no toto0 for iteration or toto[] for array). Also, if you use the <U>formdata</U>
359 * applet parameter, these parameters are sent as is (no 0 or [] added to the parameter name).</td>
360 * </tr>
361 * <tr>
362 * <td>keepOriginalFileExtensionForConvertedImages</td>
363 * <td><i>false</i></td>
364 * <td>is only relevant, if targetPictureFormat is specified.<br />
365 * <ul>
366 * <li>false (default): <br />
367 * If you upload the file 'test.png' and it is converted to 'jpg', the fileextension will be changed, so that the server
368 * will receive this filename: 'test.jpg'</li>
369 * <li>true: <br />
370 * If you upload the file 'test.png' and it is converted to 'jpg', the fileextension will NOT be changed, so that the
371 * server will receive the original filename: 'test.png'</li>
372 * </ul>
373 * </td>
374 * </tr>
375 * <tr>
376 * <td>lang</td>
377 * <td>Navigator language <br>
378 * <br>
379 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
380 * <td>Should be something like <i>en</i>, <i>fr</i>... Currently only French and English are known from the applet. If
381 * anyone want to add another language ... Please translate the wjhk.jupload2.lang.lang_en, and send it back to
382 * <mailto:etienne_sf@sourceforge.net">.</td>
383 * </tr>
384 * <tr>
385 * <td>lookAndFeel <br>
386 * since 2.5</td>
387 * <td><i>empty</i><br>
388 * <br>
389 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
390 * <td>This allows to control the look & feel of the applet. The authorized values are:
391 * <ul>
392 * <li><i>empty</i>: uses the default look & feel. This is the same as java.
393 * <li>java: uses the java default look & feel. Same as <i>empty</i>.
394 * <li>system: uses the current system look and feel. The call will be : <br>
395 * UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
396 * <li>Any valid String argument for UIManager.setLookAndFeel(String).
397 * </ul>
398 * </td>
399 * </tr>
400 * <tr>
401 * <td>maxChunkSize<br>
402 * Since 2.7.1</td>
403 * <td>0<br>
404 * <i>Long.MAX_VALUE</i><br>
405 * <br>
406 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
407 * <td>This parameters defines the maximum size of an upload.
408 * <ul>
409 * <li>If not set, or set to a value of 0 or less, the chunk mode is disabled. That is: each file will be uploaded
410 * within being split in pieces.
411 * <li>If set to a value of 1 or more, the upload size will be never be more than maxChunkSize. A file bigger will be
412 * split in several part of <i>maxChunkSize</i> size, then the last part will contain the remaining, and will probably
413 * be smaller than <i>maxChunkSize</i>.
414 * </ul>
415 * <br>
416 * <b>How to build the server part:</b> the server will have to 'guess' that the file is split, and then it will have to
417 * reconstruct the uploaded file. Here are the necessary informations:
418 * <ul>
419 * <li>When a file is chunked, the <i>jupart</i> and <i>jufinal</i> parameter are given in the URL (get parameters).
420 * This identify a chunk upload. If these parameters are not given, the file(s) is(are) uploaded in one piece.
421 * <li><i>jupart</i> identify the part number: from 1 to N for a file being split in N pieces. The N-1 chunks should be
422 * <i>maxChunkSize</i> bytes long. The last one contains the remaining of the file.
423 * <li><i>jufinal</i> is set to 0 for chunks from 1 to N-1. It is is set to 1 only for the last chunk (N, in this
424 * 'example').
425 * <li>The uploaded filename is not modified when the upload is chunked. Example: upload of the file
426 * <i>bigPicture.jpeg</i>, of 4,5 Mb, with chunk of 2Mb. The upload is split in three chunk. Chunk 1 and 2 are 2Mb long.
427 * The third one is 0,5Mb long. The uploaded filename for these three uploads is <i>bigPicture.jpeg</i>. It's up to the
428 * server part to read the <i>jupart</i> and <i>jufinal</i> get parameters, to understand that the upload is chunked.
429 * <li><b>Important:</b> The server script <u>must</u> check the resulting filesize. If not, the client can send a file
430 * of any size, and fill the server hard drive.
431 * <li>The site:samples.java/parseRequest.jsp is a java example of a server page that can receive chunk upload. It
432 * stores each chunk is <i>filename.partN</i> (where N is the chunk number), then construct the final file, by
433 * concatenating all parts together.
434 * </ul>
435 * <b>Note: </b> If nbFilesPerRequest is different than 1, the applet will try to upload the files until the sum of
436 * their content length is less than maxChunkSize. The upload is triggered just before the sum of their content length
437 * is bigger then maxChunkSize.<br>
438 * If one file is bigger than <i>maxChunkSize</i>, all previous files are uploaded (at once or not, depending on
439 * nbFilesPerRequest). Then the 'big' file is uploaded alone, split in chunk. Then upload goes on, file by file or not,
440 * depending on <i>nbFilesPerRequest</i>.</td>
441 * </tr>
442 * <tr>
443 * <td>maxFileSize<br>
444 * Since 2.7.1</td>
445 * <td>0<br>
446 * <i>Long.MAX_VALUE</i><br>
447 * <br>
448 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
449 * <td>This parameter identify the maximum size that an uploaded file may have. It prevent the user to upload too big
450 * files. It is especially important when chunk upload is activated (see below <i>maxChunkSize</i>).
451 * <ul>
452 * <li>If <i>maxChunkSize</i> is not set, negative or 0, <i>maxFileSize</i> should be the maximum upload size of the
453 * server. In this case, it is useful only to display a message when the user select a file that will be refused by the
454 * server.
455 * <li>If chunk upload is activated, this parameter becomes really important: in this case the maximum file size of an
456 * uploaded file is ... the available space on the server hard drive! (see below, <i>maxChunkSize</i>).
457 * </ul>
458 * </td>
459 * </tr>
460 * <tr>
461 * <td>maxPicHeight</td>
462 * <td>Since 3.3.0: Integer.MAX_VALUE<BR>
463 * (was -1)<br>
464 * <br>
465 * {@link wjhk.jupload2.policies.PictureUploadPolicy}</td>
466 * <td>This parameters allows the HTML page to control the maximum height for pictures. If a picture is to be download,
467 * and its height is bigger, the picture will be resized. The proportion between width and height of the resized picture
468 * are the same as those of the original picture. If both maxPicHeight and maxPicWidth are given, it can happen that the
469 * resized picture has a height lesser than maxPicHeight, so that width is no more than maxPicWidth. <br>
470 * <b>Precisions:</b> <br>
471 * If this parameter value is negative or 0, then no control is done on the picture height. <br>
472 * If the original picture is smaller than the maximum size, the picture is not enlarged. <br>
473 * If the picture is resized, its other characteristics are kept (number of colors, ColorModel...). The picture format
474 * is kept, if targetPictureFormat is empty. If the picture format is a destructive (like jpeg), the maximum available
475 * quality is chosen. <br>
476 * <i>See also maxPicWidth, realMaxPicHeight</i></td>
477 * </tr>
478 * <tr>
479 * <td>maxPicWidth</td>
480 * <td>Since 3.3.0: Integer.MAX_VALUE<BR>
481 * (was -1)<br>
482 * <br>
483 * {@link wjhk.jupload2.policies.PictureUploadPolicy}</td>
484 * <td>Same as maxPicHeight, but for the maximum width of the uploaded picture. <br>
485 * <i>See also maxPicHeight, realMaxPicWidth</i></td>
486 * </tr>
487 * <tr>
488 * <td>nbFilesPerRequest</td>
489 * <td>1 since 4.3.0 <BR>
490 * (was -1) <br>
491 * <br>
492 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
493 * <td>This allows the control of the maximal number of files that are uploaded in one HTTP upload to the server. <br>
494 * If set to less than 1 (0 or negative), there is no maximum. This means that all files are uploaded in the same HTTP
495 * request. <br>
496 * If set to 5, for instance, and there are 6 files to upload, there will be two HTTP upload request to the server : 5
497 * files in the first one, and that last file in a second HTTP request.</td>
498 * </tr>
499 * <tr>
500 * <td>pictureCompressionQuality</td>
501 * <td><i>0.8</i><br>
502 * since 3.1.0<br>
503 * {@link wjhk.jupload2.policies.PictureUploadPolicy}</td>
504 * <td>This parameter controls the picture compression quality, when writing the picture file. 1 means high quality
505 * picture, but big files. 0 means poor quality pictures, but small files. 0.8 is a good compromise for the web.<br>
506 * It is different from the highQualityPreview, which controls the way picture are resized in memory.<br>
507 * This parameter is currently applied only to jpg (and jpeg) pictures.</td>
508 * </tr>
509 * <tr>
510 * <td>pictureTransmitMetadata</td>
511 * <td><i>false since 3.3.0<br>
512 * (was true before)</i><br>
513 * since 3.2.0<br>
514 * {@link wjhk.jupload2.policies.PictureUploadPolicy}</td>
515 * <td>This parameter controls whether the applet transmit metadata of the original picture. This may prevent personal
516 * information to be thrown on the net.<br>
517 * Note 1: This parameter is especially important for picture coming from the Canon EOS 20D, 30D and 40D: pictures
518 * shooted in portrait mode contain metadata that are incompatible with Java 1.6.0_3! The colors of transformed pictures
519 * become strange... <B>Since 3.3.0: default to false</B>, to avoid this annonying (and currently not explained)
520 * problem.<br>
521 * Note 2: <Caution> As of 3.2.0, this parameter blocks metadata only for pictures that are updated by the applet.
522 * Metadata from picture transmitted 'as is' are not removed. This is corrected in 3.3.0.</td>
523 * </tr>
524 * <tr>
525 * <td>postURL</td>
526 * <td>null since 1.9.2rc4, (was <i>Mandatory</i> before)<br>
527 * <br>
528 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
529 * <td>This parameter specifies the target URL toward which the files should be uploaded. Since version 1.9.2rc4 this
530 * parameter is not mandatory anymore. Instead, if omitted or a <i>relative</i> URL is given, the resulting URL is
531 * constructed from the applet's DocumentBaseURL. This means, that if the applet tag is dynamically constructed from a
532 * PHP script without specifying <code>postURL</code>, the <i>same</i> same script receives the subsequent POST
533 * request(s). If this URL may change during the applet execution time, you can call the setProperty applet method from
534 * javascript, or create a new UploadPolicy class and either :
535 * <ul>
536 * <li>Override the {@link wjhk.jupload2.policies.UploadPolicy#getPostURL()} method, to make the postURL totaly dynamic.
537 * <li>Override the {@link wjhk.jupload2.policies.UploadPolicy#setPostURL(String)} method, to modify the postURL on the
538 * fly, when it is changed.
539 * <li>Override the {@link wjhk.jupload2.policies.UploadPolicy#setProperty(String, String)} method. The
540 * {@link wjhk.jupload2.policies.CoppermineUploadPolicy} changes the postURL when the albumID property changes.
541 * <li>Find another solution ...
542 * </ul>
543 * <u>Note 1:</u> in HTTP, the upload is done in the same user session, as the applet uses the cookies from the
544 * navigator. This allows right management during upload, on the server side.<br>
545 * <u>Note 2:</u> in FTP, you can't use path that contain spaces. Filename may contain spaces. <u>Note 5:</u> in HTTP,
546 * the applet use the current Java parameter to connect to the host. By default, this configuration is to use the
547 * navigator configuration. So, if a proxy is configured in the navigator network configuration, the applet should use
548 * it automatically.<br>
549 * <u>Note 3:</u> FTP URL should looks like: ftp://username:password@myhost.com:21/directory<br>
550 * <u>Note 4:</u> in FTP, you'll have to add the jakarta-commons-oro.jar and jakarta-commons-net.jar jar files in the
551 * applet ARCHIVE tag attribute. See the 'advanced_js_demo.html page for a sample. You'll have to put the two files
552 * coming from the JUpload distribution in the same directory as the wjhk.jupload.jar. <br>
553 * <u>Note 5:</u> in FTP, you can use the user default folder by putting no folder. The URL can be: ftp://user:mdp@host</td>
554 * <u>Note 6 (security):</u> take care that the full URL is visible, if the user take a look at the page source. So, you
555 * should take care when putting login and password there. </td>
556 * </tr>
557 * <tr>
558 * <td>readCookieFromNavigator</td>
559 * <td>Since 4.3.0: Boolean<BR>
560 * (true)<br>
561 * <br>
562 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}<br>
563 * <i>Since v2.8.1</i></td>
564 * <td>If true (default), the applet read cookies from the navigator, with the javascript document.cookie value. If
565 * false, the caller should put the relevant 'Cookie' header in the specificHeaders applet parameter. This allows to
566 * override any javascript cookie access restriction.</td>
567 * </tr>
568 * <td>readUserAgentFromNavigator</td>
569 * <td>Since 4.6.1rc2: Boolean<BR>
570 * (true)<br>
571 * <br>
572 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}<br>
573 * </td>
574 * <td>If true (default), the applet read the userAgent from the navigator, with the javascript document.userAgent
575 * value. If false, the caller can put the relevant userAgent header in the specificHeaders applet parameter.</td> </tr>
576 * <tr>
577 * <td>realMaxPicHeight</td>
578 * <td>Since 3.3.0: Integer.MAX_VALUE<BR>
579 * (was -1)<br>
580 * <br>
581 * {@link wjhk.jupload2.policies.PictureUploadPolicy}<br>
582 * <i>Since v2.8.1</i></td>
583 * <td>This parameters is about the same as maxPicHeight. It overrides it for pictures that must be transformed
584 * (currentlty only when the picture is rotated). <br>
585 * The aim of this parameter, is to prevent the applet to resize picture, and let the server do it: it will be much
586 * quicker. <br>
587 * This allows you to:
588 * <ul>
589 * <li>Put a 'big' <i>maxPicHeight</i> (or don't provide the parameter in the APPLET tag), and let the server resize the
590 * picture according to the real maxPicHeight. The <i>maxPicHeight</i> will be used when the picture is not tranformed
591 * by the user.
592 * <li>Put this realMaxHeight to the real configured maxPicHeight. The applet will then directly produce the final file,
593 * when it has to tranform the picture (picture rotation, for instance).
594 * </ul>
595 * <br>
596 * <i>See also maxPicHeight, realMaxPicWidth, maxChunkSize (to override any server upload size limitation).</i></td>
597 * </tr>
598 * <tr>
599 * <td>realMaxPicWidth</td>
600 * <td>Since 3.3.0: Integer.MAX_VALUE<BR>
601 * (was -1)<br>
602 * <br>
603 * {@link wjhk.jupload2.policies.PictureUploadPolicy}<br>
604 * <i>Since v2.8.1</i></td>
605 * <td>Same as realMaxPicHeight, but for the maximum width of uploaded picture that must be transformed. <br>
606 * <i>See also maxPicWidth, realMaxPicHeight</i></td>
607 * </tr>
608 * <tr>
609 * <td>retryMaxNumberOf</td>
610 * <td>1<BR>
611 * <i>Since 5.0.0</i></td>
612 * <td>Maximum number of retries, that the applet will do, for upload resumable error. A 'upload resumable error', is
613 * typically a network error. The default value is 0, to maintain the same behaviour as before.<BR>
614 * This maximum of allowed retries is for each packet, that is: if one packet fails two times, and succeed in the third
615 * attempt, the next packet will still have up to retryMaxNumberOf retries. For instance, the default value (1), means
616 * that the applet will do a one new attempt after a first upload error, for each packet.</td>
617 * </tr>
618 * <tr>
619 * <td>retryNbSecondsBetween</td>
620 * <td>30<BR>
621 * <i>Since 5.0.0</i></td>
622 * <td>The number of seconds, to wait, before trying a new upload of a packet whose upload was in error. This is used if
623 * <I>retryMaxNumberOf</I> is 1 or more, and if 'resumable upload error' occurs.</td>
624 * </tr>
625 * <tr>
626 * <td>serverProtocol</td>
627 * <td>null since 2.9.2rc4<br>
628 * (before: "HTTP/1.1")<br>
629 * <br>
630 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
631 * <td>This parameter allows the control of the protocol toward the server. It can be HTTP/0.9 (not tested), HTTP/1.0,
632 * HTTP/1.1 and FTP. HTTP supports https. Since version 2.9.2rc4, the default is <i>null</i>, introducing a new facility
633 * of automatically adjusting the protocol according to the server response.<br>
634 * This parameter is really useful only in {@link wjhk.jupload2.policies.CoppermineUploadPolicy}, as the coppermine
635 * application also controls that the requests send within an HTTP session uses the same HTTP protocol (as a protection
636 * to limit the 'steal' of session cookies).</td>
637 * </tr>
638 * <tr>
639 * <td>sendMD5Sum</td>
640 * <td>false<BR>
641 * since 5.0.0<br>
642 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
643 * <td>This parameter indicates whether the applet will send the MD5Sum for uploaded files, or not. If set to true, the
644 * MD5Sum is sent in the <I>md5sum</I> HTTP POST argument.</td>
645 * </tr>
646 * <tr>
647 * <td>showLogWindow<br>
648 * Since 3.0.2<br>
649 * Changed in 3.5.0</td>
650 * <td>true<br>
651 * <br>
652 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
653 * <td>This parameter was formerly known as <i>showStatusBar</i> which now has a different purpose. <BR>
654 * <U>Since 3.5.0:</U> Available values are (case sensitive):<DIR>
655 * <LI>true: always visible.
656 * <LI>false: always hiden.
657 * <LI>onError: the log window is hidden. It will be displayed when an error occurs. If you put 99 into the debugLevel,
658 * then the full debugOutput become visible if and only if an error occurs</DIR> <BR>
659 * <U>Until 3.4.2</U>, it works this way: If given with the <i>False</i> value, the log window will be hidden. The
660 * applet will still store all debug information in it. But the user won't see it any more. If a problem occurs, the
661 * <i>urlToSendErrorTo</i> can still be used to log all available information.</td>
662 * </tr>
663 * <tr>
664 * <td>showStatusBar</td>
665 * <td>True<br>
666 * <br>
667 * New meaning since 3.0.2<br>
668 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
669 * <td>This parameter controls if the status bar is shown in the applet. If shown, the stausbar provides information
670 * about the current transfer speed and estimated time of completion. Before version 3.0.2, this parameter was used to
671 * control visibility of the log window. This is now controlled by <i>showLogWindow</i>.</td>
672 * </tr>
673 * <tr>
674 * <td>specificHeaders</td>
675 * <td><I>null</I><br>
676 * <br>
677 * Since 3.0.2<br>
678 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
679 * <td>Allows the caller to add any header(s) to the applet. These headers will be sent with each HTTP request to the
680 * server. If you put several lines in this parameter, these parameter should be separated by the "\n" string (not
681 * the LineFeed character, but the antislash character followed by the n character, like msg="\\n";). No
682 * "\n" at the end: it will be added by the applet. In PHP, put '\n', and not "\n" (See PHP doc, on strings)
683 * <BR>
684 * This allows an easy management of <B>Basic HTTP authentication</B>. Just add a header like this one:<BR>
685 * Authorization: Basic Base64EncodedString Where Base64EncodedString is the string "login:passord" encoded in Base 64.</td>
686 * </tr>
687 * <tr>
688 * <td>sslVerifyCert<br>
689 * Since 3.0.2b1</td>
690 * <td>none<br>
691 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
692 * <td>With this parameter, the handling of certificates when using SSL can be configured. There are 4 possible
693 * settings:<br>
694 * <ul>
695 * <li><i>none</i> (default): Any server cert is accepted, no cert-based client authentication is performed.</li>
696 * <li><i>server</i>: The server cert is verified against the local truststore and if that fails, a dialog pops up which
697 * asks the user if the certificate shall be accepted permanently, just for the current session or not at all (Just like
698 * any browser would do).</li>
699 * <li><i>client</i>: A user-certificate (which must be available in the local keystore) is used to perform client
700 * authentication.</li>
701 * <li><i>strict</i>: The combination of <i>client</i> and <i>server</i>.</li>
702 * </ul>
703 * <p>
704 * The location of the local truststore and keystore uses the normal JRE conventions. This means, that the system
705 * truststore is used for verifying server certs (usually in $JAVA_HOME/lib/security/cacerts) unless either the system
706 * property <i>javax.net.ssl.trusStore</i> specifies another location or a file <b>.truststore</b> exists in the user's
707 * home directory. If the user decides to permanently accept an untrusted certificate, the file <b>.truststore</b> in
708 * the user's home directory is written. The default keystore (for client certificates) is the file <b>.keystore</b> in
709 * the user's home directory. This can be overridden by setting the system property <i>javax.net.ssl.keyStore</i>. If
710 * the name of the keystore ends in <b>.p12</b>, it is assumed that the keystore is in <b>PKCS12</b> format, otherwise
711 * the default format as specified in the JRE security-configuration is used.
712 * <p>
713 * <b>Important Note about client authentication:</b>
714 * <p>
715 * At the time of this writing, a <i>serious</i> bug exists in apache 2.0.x which prevents POST requests when SSL
716 * renegotiation is about to happen. Renegotiation is triggered by a location-based (or directory-based) change of the
717 * SSLVerifyClient directive in apache. Therefore you <b>can not</b> protect a sub-area of an otherwise unprotected SSL
718 * server. You can circumvent that by setting up a virtualhost which is configured to perform SSL client verification
719 * <b>for the complete virtualhost</b>. Attached to the bug report at <a
720 * href="http://issues.apache.org/bugzilla/show_bug.cgi?id=12355">ASF Bugzilla</a>, there are several patches which
721 * claim to fix the problem. However in that same report, other users complain about those patches to be ineffective.
722 * Therefore, the author recommends avoiding re-negotiation alltogether by using the virtualhost aproach described
723 * above. It is the understanding of the author, that this bug has been fixed for apache 2.2, however the author did not
724 * verify that. Test-Reports from users running apache 2.2 are welcome.</td>
725 * </tr>
726 * <tr>
727 * <td>storeBufferedImage</td>
728 * <td>false <br>
729 * <I>Deprecated</I> <br>
730 * {@link wjhk.jupload2.policies.PictureUploadPolicy}</td>
731 * <td>This parameter indicates that the preview image on the applet is kept in memory. It works really nice under
732 * eclise. But, once in the navigator, the applet runs very quickly out of memory. So I add a lot of calls to
733 * {@link wjhk.jupload2.filedata.PictureFileData#freeMemory(String, UploadPolicy)} , but it doesn't change anything. Be
734 * careful to this parameter, and let it to the default value, unless you've well tested it under all your target client
735 * configurations. <BR>
736 * <I>This parameter will probably never be correctly implemented.</I></td>
737 * </tr>
738 * <tr>
739 * <td>stringUploadError</td>
740 * <td>Since 3.2.0: "^ERROR: (.*)$" for all upload policies<br>
741 * Empty string ("") [if using DefaultUploadPolicy]<br>
742 * "ERROR: (.*)" [if using CopperminUploadPolicy]<br>
743 * <br>
744 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}<br>
745 * Since 2.9.2rc4</td>
746 * <td>This string is a regular expression. It allows the applet to test that the server has detected an error in the
747 * upload. If this parameter is given to the applet, the upload thread will try to match this regular expression against
748 * each line of the server response <b>body</b>. If a group is found, it is considered as the error message, and will be
749 * displayed to the user.<br>
750 * If the match is successfull once, the upload is considered to have failed. and
751 * {@link wjhk.jupload2.exception.JUploadExceptionUploadFailed} is thrown. If the expression contains a hunt-group, the
752 * matching contents of that group is reported to the user. For example: If let the default value "^ERROR: (.*)$" here,
753 * the applet will find an error if at least one line returned in the server response begins with "ERROR: ". Then, all
754 * characters that follow are extracted as the error message. So, if the server response contains the line
755 * "ERROR: md5sum check failed", the string "md5sum check failed" is used for the exception message. But if it returns a
756 * line "maybe ERROR: is it an error?", then the applet won't find any error in the server response. <BR>
757 * <B>Note:</B> you can put line breaks in the error message. The message must be in one line in the HTTP response. To
758 * display a line break to the user, just put the two characters \n in the http response (would be a "\\n" in java or
759 * PHP).</td>
760 * </tr>
761 * <tr>
762 * <td>stringUploadSuccess</td>
763 * <td>"^SUCCESS$"<br>
764 * empty string ("") since 2.9.0<br>
765 * (was ".* 200 OK$" before) <br>
766 * <br>
767 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
768 * <td>This string is a regular expression. It allows the applet to test that the server has accepted the upload. If
769 * this parameter is given to the applet, the upload thread will try to match this regular expression against each lines
770 * returned from the server.<br>
771 * If the match is successfull once, the upload is considered to be a success. If not, a
772 * {@link wjhk.jupload2.exception.JUploadExceptionUploadFailed} is thrown. <br>
773 * The default test expression testes that the web server returns no HTTP error: 200 is the return code for a
774 * successfull HTTP request. It actually means that postURL is a valid URL, and that the applet was able to send a
775 * request to this URL: there should be no problem with the network configuration, like proxy, password proxy...). <br>
776 * <b>But</b> it doesn't mean that the uploaded files have correctly be managed by the server. For instance, the URL can
777 * be http://sourceforge.net, which, of course, would not take your files into account. <br>
778 * So, as soon as you know a regular expression that test the return from the target application (and not just a
779 * techical HTTP response code), change the stringUploadSuccess to this value. For instance, the default value will be
780 * matched if the HTTP body content of the server response contains one line that is exactly 'SUCCESS', without any
781 * other character. This 'success' means that the pictures have correctly uploaded to the server, and that he
782 * successfully managed the uploaded files.</td>
783 * </tr>
784 * <tr>
785 * <td>stringUploadWarning</td>
786 * <td>"^WARNING: (.*)$" <br>
787 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}<br>
788 * Since 3.4.2</td>
789 * <td>This string is a regular expression. It allows the applet to test that the server has detected a warning was
790 * generated by the server. This warning is just a warning, that will be displayed to the user, as is. There may be
791 * several warnings in the server return. If one or more warning is/are received, the message(s) will be displayed to
792 * the user.<BR>
793 * If the expression contains a hunt-group, the matching contents of that group is reported to the user. For example: If
794 * you let the default value "^WARNING: (.*)$" here, the applet will find an error if at least one line returned in the
795 * server response begins with "WARNING: ". Then, all characters that follow are extracted as the error message. So, if
796 * the server response contains the line "WARNING: Bad encoding", the string "Bad encoding" is displayed as warning
797 * message to the user. But if it returns a line "maybe WARNING: is it an error?", then the applet won't find any
798 * warning in the server response.<BR>
799 * <B>Notes:</B> <DIR>
800 * <LI>There is no link between these warning and the fact the upload is considered to be a success or not. Upload
801 * success is only based on the success and error string. See the <B>stringUploadSuccess</B> and
802 * <B>stringUploadError</B> applet parameters, here above.
803 * <LI>You can put line breaks in the error message. The message must be in one line in the HTTP response. To display a
804 * line break to the user, just put the two characters \n in the http response (would be a "\\n" in java or PHP). </DIR>
805 * </td>
806 * </tr>
807 * <tr>
808 * <td>targetPictureFormat</td>
809 * <td><i>Empty String</i><br />
810 * {@link wjhk.jupload2.policies.PictureUploadPolicy}</td>
811 * <td>This parameter can contain a list to convert image formats
812 * <p>
813 * Example 1:{@code "png,bmp:jpg;gif:png;"}
814 * <ul>
815 * <li>both png and bmp files will be converted to jpg,</li>
816 * <li>gif files will be converted to png</li>
817 * </ul>
818 * Example 2:{@code "jpeg,jpg:png;"}
819 * <ul>
820 * <li>both jpeg and jpg files will be converted to png,</li>
821 * </ul>
822 * </p>
823 * the value is expected to be a semi-colon separated list of relations from source-format(s) to a target format.<br />
824 * format: <code>{SOURCEFORMAT{,SOURCEFORMAT*}:TARGETFORMAT;}*</code>
825 * <ul>
826 * <li>formats can contain any picture writer known by the JVM. For instance: jpeg, png, gif. All standard formats
827 * should be available. More information can be found on the <a
828 * href="http://java.sun.com/j2se/1.4.2/docs/guide/imageio/spec/title.fm.html" >java.sun.com</a> web site.
829 * <li>SOURCEFORMAT: the source format that should be converted to the TARGETFORMAT<br />
830 * e.g. png, jpg, jpeg, ..</li>
831 * <li>TARGETFORMAT: the target format that all given SOURCEFORMAT should be converted to <br />
832 * e.g. png, jpg, jpeg, ..</li>
833 * <li>all format strings are case insensitive, so all following strings are the same:
834 * <ul>
835 * <li><code>"jpeg,jpg:png;"</code></li>
836 * <li><code>"JPEG,JPG:PNG;"</code></li>
837 * <li><code>"jPeG,JpG:pNg;"</code></li>
838 * </ul>
839 * </li>
840 * </ul>
841 * notes:
842 * <ul>
843 * <li>animated gifs will not be converted</li>
844 * <li>jpg and jpeg are distinct types.</li>
845 * <li>gifs can only be converted if the user has installed JRE >= 1.6</li>
846 * <li>the trailing semi-colon is optional</li>
847 * <li>when a file needs to be transformed, the content type will reflect the new picture format. the file extension
848 * will be changed dependant on the parameter <code>keepOriginalFileExtensionForConvertedImages</code>
849 * <ul>
850 * <li>example1:
851 * <ul>
852 * <li><code>targetPictureFormat="bmp:png;"</code></li>
853 * <li><code>keepOriginalFileExtensionForConvertedImages=false</code> (default)</li>
854 * </ul>
855 * When you upload: <code>C:\myBitmap.bmp</code>, the filename will be changed to <code>C:\myBitmap.png</code> and
856 * transferred to the server, and the content-type will be changed to "image/png"</li>
857 * <li>
858 * <li>example2:
859 * <ul>
860 * <li><code>targetPictureFormat="bmp:png;"</code></li>
861 * <li><code>keepOriginalFileExtensionForConvertedImages=true</code></li>
862 * </ul>
863 * When you upload: <code>C:\myBitmap.bmp</code>, the filename will NOT be changed and transferred to the server, but
864 * the content-type will be changed to "image/png"</li>
865 * </ul>
866 * </li>
867 * </ul>
868 * see {@link wjhk.jupload2.filedata.helper.ImageFileConversionInfo}<br />
869 * see keepOriginalFileExtensionForConvertedImages</td>
870 * </tr>
871 * <tr>
872 * <td><b>uploadPolicy</b></td>
873 * <td>DefaultUploadPolicy <br>
874 * <br>
875 * see {@link wjhk.jupload2.policies.UploadPolicyFactory}</td>
876 * <td>This parameter contains the class name for the UploadPolicy that should be used. If it is not set, or if its
877 * value is unknown from {@link wjhk.jupload2.policies.UploadPolicyFactory#getUploadPolicy(JUploadContext)} , the
878 * {@link wjhk.jupload2.policies.DefaultUploadPolicy} is used.</td>
879 * </tr>
880 * <tr>
881 * <td>urlToSendErrorTo</td>
882 * <td><i>null</i> <br>
883 * <br>
884 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
885 * <td>If this url is given, and an upload error occurs, the applet posts all debug output to this address. It's up to
886 * this URL to handle this message. It is possible to just store the file, or to log the error in a database, or to send
887 * a mail (like the mail.php script given with the coppermine pack). <br>
888 * <u>Notes:</u> <DIR>
889 * <LI>Only http and https URL schemes are supported.</LI>
890 * <LI>The error information is sent in a POST request sent to the given URL. These post parameters are used:
891 * description (a quick description of the error), javaError (the java output for the error, or null if no java error
892 * were caught) and debugOutput (the full debug generated by the applet).</LI> </DIR></td>
893 * </tr>
894 * </table>
895 * <h3><a name="example">HTML call example</a></h3>
896 * <p>
897 * Below, an example of how to put the applet into a PHP page is shown:
898 * </p>
899 * <code><pre>
900 * <applet name="JUpload" code="wjhk.jupload2.JUploadApplet"
901 * archive="plugins/jupload/wjhk.jupload.jar"
902 * <!-- Applet display size, on the navigator page -->
903 * width="500" height="700"
904 * <!-- The applet uses some javascript functions, so we must allow that : -->
905 * mayscript="true">
906 * <!-- No parameter is mandatory. We don't precise the UploadPolicy, so
907 * DefaultUploadPolicy is used. The applet behaves like the original
908 * JUpload. (jupload v1) -->
909 * <param name="postURL" value="http://some.host.com/youruploadpage.php">
910 * Java 1.5 or higher plugin required.
911 * </applet>
912 * </pre></code> <BR>
913 * <!-- ANT_COPYDOC_END --> <!-- ATTENTION: The previous comment is used by Ant build. DO NOT CHANGE!! -->
914 *
915 * @author etienne_sf
916 * @version $Revision: 1719 $
917 * @see wjhk.jupload2.policies.DefaultUploadPolicy
918 */
919
920 public interface UploadPolicy {
921
922 /*
923 * Available parameters for the applet. New parameters (for instance for new policies) should all be added here, in
924 * alphabetic order. This ensures that all tags are unique
925 */
926
927 /***************************************************************************
928 * ************************************************************************ ************************* LIST OF
929 * PROPERTIES ************************** ************************************************************************
930 **************************************************************************/
931 /**
932 * Parameter/Property name for URL to be loaded after an successful upload.
933 */
934 public final static String PROP_AFTER_UPLOAD_URL = "afterUploadURL";
935
936 /**
937 * Parameter/Property name for allowing persistent HTTP connections.
938 */
939 public final static String PROP_ALLOW_HTTP_PERSISTENT = "allowHttpPersistent";
940
941 /**
942 * Parameter/Property name for specifying the allowed file extensions
943 */
944 public final static String PROP_ALLOWED_FILE_EXTENSIONS = "allowedFileExtensions";
945
946 /**
947 * Parameter/Property name for specifying the album id
948 */
949 public final static String PROP_ALBUM_ID = "albumId";
950
951 /**
952 * Indicates the directory, from which the applet should open the browsing window (file chooser) first.
953 */
954 public final static String PROP_BROWSING_DIRECTORY = "browsingDirectory";
955
956 /**
957 * Parameter/Property name for specifying if images should be cached in memory. Be careful: if set to true, you'll
958 * probably have memory problems while in a navigator.
959 */
960 public final static String PROP_STORE_BUFFERED_IMAGE = "storeBufferedImage";
961
962 /**
963 * Parameter/Property name for specifying the debug level
964 */
965 public final static String PROP_DEBUG_LEVEL = "debugLevel";
966
967 /**
968 * This parameter allows to control whether the file icons in the file chooser are calculated from the file content.
969 * This is currently only available for pictures.<BR>
970 * If activated, the file chooser will open each pictures, and calculate the icon by resizing the picture. This is
971 * done in by using thread of minimam priority, to minimize performances impact on the navigator. Available values
972 * are: <DIR> <LI>-1: disabled. The default system are used. <LI>0 (default): available only in picture mode. That
973 * is: the current upload policy is an instance of or a class inheriting from {@link PictureUploadPolicy} <LI>1:
974 * available for all upload policies. </DIR>
975 */
976 public final static String PROP_FILE_CHOOSER_ICON_FROM_FILE_CONTENT = "fileChooserIconFromFileContent";
977
978 /**
979 * This parameter allows to control the size of icons, in pixels, in the file chooser. Used only when
980 * fileChooserIconFromFileContent is activated.
981 */
982 public final static String PROP_FILE_CHOOSER_ICON_SIZE = "fileChooserIconSize";
983
984 /**
985 * Allows control on the preview on the file chooser. Only for {@link PictureUploadPolicy} and its inheritants.
986 */
987 public final static String PROP_FILE_CHOOSER_IMAGE_PREVIEW = "fileChooserImagePreview";
988
989 /**
990 * Contains the name of the file filter, as it will be displayed in the drop down list of filters, in the file
991 * chooser. If this name is given to the applet, it will be returned by the {@link FileFilter#getDescription()}
992 * method.
993 */
994 public final static String PROP_FILE_FILTER_NAME = "fileFilterName";
995
996 /** Parameter/Property name for specifying the way the file list is displayed. */
997 public final static String PROP_FILE_LIST_VIEW_MODE = "fileListViewMode";
998
999 /** Parameter/Property name for specifying the encoding of file names. */
1000 public final static String PROP_FILENAME_ENCODING = "filenameEncoding";
1001
1002 /**
1003 * Parameter/Property name for specifying additional form data.
1004 */
1005 public final static String PROP_FORMDATA = "formdata";
1006
1007 /**
1008 * Parameter/Property name to specify, when in FTP mode, if subfolders must be created, or if all files must be
1009 * uploaded on the root of postURL.
1010 */
1011 public final static String PROP_FTP_CREATE_DIRECTORY_STRUCTURE = "ftpCreateDirectoryStructure";
1012
1013 /** FTP: binary or ascii mode */
1014 public final static String PROP_FTP_TRANSFERT_BINARY = "ftpTransfertBinary";
1015
1016 /** FTP: passive or active mode */
1017 public final static String PROP_FTP_TRANSFERT_PASSIVE = "ftpTransfertPassive";
1018
1019 /**
1020 * Parameter/Property name for specifying high quality previews.
1021 */
1022 public final static String PROP_HIGH_QUALITY_PREVIEW = "highQualityPreview";
1023
1024 /**
1025 * Parameter/Property name for specifying high quality previews.
1026 */
1027 public final static String PROP_HTTP_UPLOAD_PARAMETER_NAME = "httpUploadParameterName";
1028
1029 /**
1030 * Parameter/Property name for specifying high quality previews.
1031 */
1032 public final static String PROP_HTTP_UPLOAD_PARAMETER_TYPE = "httpUploadParameterType";
1033
1034 /**
1035 * Parameter/Property name for specifying the UI language
1036 */
1037 public final static String PROP_LANG = "lang";
1038
1039 /**
1040 * Parameter/Property name for specifying a list of specific headers, that will be added to all HTTP request to the
1041 * server. The parameter can be used for Basic Authentication, by adding this header: Authorization: Basic [Bae64
1042 * encoding of the string "user:password"]
1043 */
1044 public final static String PROP_SPECIFIC_HEADERS = "specificHeaders";
1045
1046 /**
1047 * Parameter/Property name for specifying a PLAF class to load.
1048 */
1049 public final static String PROP_LOOK_AND_FEEL = "lookAndFeel";
1050
1051 /**
1052 * Parameter/Property name for specifying the maximum size of a chunk of uploaded data.
1053 */
1054 public final static String PROP_MAX_CHUNK_SIZE = "maxChunkSize";
1055
1056 /**
1057 * Parameter/Property name for specifying the maximum size of a single file.
1058 */
1059 public final static String PROP_MAX_FILE_SIZE = "maxFileSize";
1060
1061 /**
1062 * Parameter/Property name for specifying the maximum height of a picture.
1063 */
1064 public final static String PROP_MAX_HEIGHT = "maxPicHeight";
1065
1066 /**
1067 * Parameter/Property name for specifying the maximum width of a picture.
1068 */
1069 public final static String PROP_MAX_WIDTH = "maxPicWidth";
1070
1071 /**
1072 * Parameter/Property name for specifying the maximum number of file to be uploaded in a single request.
1073 */
1074 public final static String PROP_NB_FILES_PER_REQUEST = "nbFilesPerRequest";
1075
1076 /**
1077 * Parameter/Property name for specifying compression of the written picture file, if any.
1078 */
1079 public final static String PROP_PICTURE_COMPRESSION_QUALITY = "pictureCompressionQuality";
1080
1081 /**
1082 * Parameter/Property name for specifying whether picture metadata (EXIF coming from the camera for instance.
1083 */
1084 public final static String PROP_PICTURE_TRANSMIT_METADATA = "pictureTransmitMetadata";
1085
1086 /**
1087 * Parameter/Property name for specifying URL of the upload post request.
1088 */
1089 public final static String PROP_POST_URL = "postURL";
1090
1091 /**
1092 * Parameter/Property name for specifying URL of the upload post request.
1093 */
1094 public final static String PROP_AFTER_UPLOAD_TARGET = "afterUploadTarget";
1095
1096 /**
1097 * Read cookies from javascript command: document.cookie (or not)
1098 */
1099 public final static String PROP_READ_COOKIE_FROM_NAVIGATOR = "readCookieFromNavigator";
1100
1101 /**
1102 * Read userAgent from javascript command: document.userAgent (or not)
1103 */
1104 public final static String PROP_READ_USER_AGENT_FROM_NAVIGATOR = "readUserAgentFromNavigator";
1105
1106 /**
1107 * Parameter/Property name for specifying the real (server-side-desired) picture height.
1108 */
1109 public final static String PROP_REAL_MAX_HEIGHT = "realMaxPicHeight";
1110
1111 /**
1112 * Parameter/Property name for specifying the real (server-side-desired) picture width.
1113 */
1114 public final static String PROP_REAL_MAX_WIDTH = "realMaxPicWidth";
1115
1116 /**
1117 * Maximum number of retries, that the applet will do, for upload resumable error. A 'upload resumable error', is
1118 * typically a network error. The default value is 0, to maintain the same behaviour as before.
1119 */
1120 public final static String PROP_RETRY_MAX_NUMBER_OF = "retryMaxNumberOf";
1121
1122 /**
1123 * The number of seconds, to wait, before trying a new upload. This is used if <I>retryMaxNumberOf</I> is 1 or more,
1124 * and if 'resumable upload error' occurs.
1125 */
1126 public final static String PROP_RETRY_NB_SECONDS_BETWEEN = "retryNbSecondsBetween";
1127
1128 /**
1129 * Parameter/Property name for specifying the server protocol version.
1130 */
1131 public final static String PROP_SERVER_PROTOCOL = "serverProtocol";
1132
1133 /**
1134 * Parameter/Property name to spceify whether the md5sum for uploaded file should be sent.
1135 */
1136 public final static String PROP_SEND_MD5_SUM = "sendMD5Sum";
1137
1138 /**
1139 * Parameter/Property name for specifying if the log window should be visible.
1140 */
1141 public final static String PROP_SHOW_LOGWINDOW = "showLogWindow";
1142
1143 /**
1144 * Parameter/Property name for specifying if the status bar should be visible.
1145 */
1146 public final static String PROP_SHOW_STATUSBAR = "showStatusbar";
1147
1148 /**
1149 * Parameter/Property name for specifying how certificates are handled when uploading via SSL.
1150 */
1151 public final static String PROP_SSL_VERIFY_CERT = "sslVerifyCert";
1152
1153 /**
1154 * Parameter/Property name for specifying if the pattern that indicates an error in the server's response-body.
1155 */
1156 public final static String PROP_STRING_UPLOAD_ERROR = "stringUploadError";
1157
1158 /**
1159 * Parameter/Property name for specifying if the pattern that indicates success in the server's response-body.
1160 */
1161 public final static String PROP_STRING_UPLOAD_SUCCESS = "stringUploadSuccess";
1162
1163 /**
1164 * Parameter/Property name for specifying if the pattern that indicates a warning in the server's response-body.
1165 */
1166 public final static String PROP_STRING_UPLOAD_WARNING = "stringUploadWarning";
1167
1168 /**
1169 * Parameter/Property name for specifying the target picture format conversions
1170 */
1171 public final static String PROP_TARGET_PICTURE_FORMAT = "targetPictureFormat";
1172
1173 /**
1174 * Parameter/Property name for specifying if the original file extension should be changed if an image is converted
1175 * to another format
1176 */
1177 public final static String PROP_KEEP_ORIG_EXTENSION = "keepOriginalFileExtensionForConvertedImages";
1178
1179 /**
1180 * Parameter/Property name for specifying the upload policy class.
1181 */
1182 public final static String PROP_UPLOAD_POLICY = "uploadPolicy";
1183
1184 /**
1185 * Parameter/Property name for specifying the URL for delivering error reports.
1186 */
1187 public final static String PROP_URL_TO_SEND_ERROR_TO = "urlToSendErrorTo";
1188
1189 /***************************************************************************
1190 * ************************************************************************ ************************* LIST OF
1191 * ALLOWED VALUES ********************* ************************************************************************
1192 **************************************************************************/
1193
1194 /**
1195 * Indicates that, in the HTTP upload request, the parameter that containts the uploaded files is an Iteration. For
1196 * instance: from File0 to FileN (for N+1 files).
1197 */
1198 public final String HTTPUPLOADPARAMETERTYPE_ARRAY = "array";
1199
1200 /**
1201 * Indicates that, in the HTTP upload request, the parameter that containts the uploaded files is an Iteration. For
1202 * instance: from File0 to FileN (for N+1 files).
1203 */
1204 public final String HTTPUPLOADPARAMETERTYPE_ITERATION = "iteration";
1205
1206 /**
1207 * Indicates that, in the HTTP upload request, there will be only one file. This value is only valid when
1208 * nbFilesPerRequest is 1. The parameters in the HTTP upload request are let untransformed. For instance, if
1209 * httpUploadParameterName is the default value (File), the file content will be loaded under the HTTP parameter
1210 * 'File'.
1211 */
1212 public final String HTTPUPLOADPARAMETERTYPE_ONE_FILE = "oneFile";
1213
1214 /** Indicates that the log window is always visible. */
1215 public final String SHOWLOGWINDOW_TRUE = "true";
1216
1217 /** Indicates that the log window is always hidden. */
1218 public final String SHOWLOGWINDOW_FALSE = "false";
1219
1220 /**
1221 * Indicates that the log window is hidden, and will become visible only when an error occurs.
1222 */
1223 public final String SHOWLOGWINDOW_ONERROR = "onError";
1224
1225 /***************************************************************************
1226 * ************************************************************************ ************************* LIST OF
1227 * DEFAULT VALUES ********************** ************************************************************************
1228 **************************************************************************/
1229
1230 /**
1231 * Default value for parameter "afterUploadTarget".
1232 */
1233 public final static String DEFAULT_AFTER_UPLOAD_TARGET = null;
1234
1235 /**
1236 * Default value for parameter "afterUploadURL"
1237 */
1238 public final static String DEFAULT_AFTER_UPLOAD_URL = null;
1239
1240 /**
1241 * Default value for parameter "allowHttpPersisten".
1242 */
1243 public final static boolean DEFAULT_ALLOW_HTTP_PERSISTENT = false;
1244
1245 /**
1246 * Default value for parameter "allowedFileExtensions".
1247 */
1248 public final static String DEFAULT_ALLOWED_FILE_EXTENSIONS = null;
1249
1250 /**
1251 * Default value for parameter "albumId".
1252 */
1253 public final static int DEFAULT_ALBUM_ID = 0;
1254
1255 /**
1256 * Default value for parameter "storeBufferedImage". Be careful: if set to true, you'll probably have memory
1257 * problems while in a navigator.
1258 */
1259 public final static boolean DEFAULT_STORE_BUFFERED_IMAGE = false;
1260
1261 /**
1262 * Default value for the browsing window first: no specific directory.
1263 */
1264 public final static String DEFAULT_BROWSING_DIRECTORY = null;
1265
1266 /**
1267 * Default value for date format when changing date/time variable to String.
1268 */
1269 public final static String DEFAULT_DATE_FORMAT = "dd/MM/yyyy HH:mm:ss";
1270
1271 /**
1272 * Default value for parameter "debugLevel".
1273 */
1274 public final static int DEFAULT_DEBUG_LEVEL = 0;
1275
1276 /**
1277 * Default value for applet parameter "fileChooserIconFromFileContent".
1278 *
1279 * @see #PROP_FILE_CHOOSER_ICON_FROM_FILE_CONTENT
1280 */
1281 public final static int DEFAULT_FILE_CHOOSER_ICON_FROM_FILE_CONTENT = 0;
1282
1283 /**
1284 * Default value for applet parameter "fileChooserIconSize".
1285 *
1286 * @see #PROP_FILE_CHOOSER_ICON_SIZE
1287 */
1288 public final static int DEFAULT_FILE_CHOOSER_ICON_SIZE = 20;
1289
1290 /**
1291 * Default value for applet parameter "fileChooserImagePreview".
1292 *
1293 * @see #PROP_FILE_CHOOSER_IMAGE_PREVIEW
1294 */
1295 public final static boolean DEFAULT_FILE_CHOOSER_IMAGE_PREVIEW = true;
1296
1297 /**
1298 * Default value for applet parameter "fileFilterName". This default value let the {@link DefaultUploadPolicy}
1299 * return a calculated name, which contains the list of allowed file extensions.
1300 *
1301 * @see #PROP_FILE_FILTER_NAME
1302 * @see #PROP_ALLOWED_FILE_EXTENSIONS
1303 */
1304 public final static String DEFAULT_FILE_FILTER_NAME = null;
1305
1306 /**
1307 * Default value for applet parameter "ftpCreateDirectoryStructure".
1308 *
1309 * @see #PROP_FTP_CREATE_DIRECTORY_STRUCTURE
1310 */
1311 public final static boolean DEFAULT_FTP_CREATE_DIRECTORY_STRUCTURE = false;
1312
1313 /** FTP: binary or ascii mode */
1314 public final static boolean DEFAULT_FTP_TRANSFERT_BINARY = true;
1315
1316 /** FTP: passive or active mode */
1317 public final static boolean DEFAULT_FTP_TRANSFERT_PASSIVE = true;
1318
1319 /** Default value for parameter "lang". */
1320 public final static String DEFAULT_LANG = null;
1321
1322 /** Default value for parameter "fileListViewMode" */
1323 public final static FilePanel.FileListViewMode DEFAULT_FILE_LIST_VIEW_MODE = FilePanel.FileListViewMode.FLAT;
1324
1325 /** Default value for parameter "filenameEncoding". Note: the CoppermineUploadPolicy forces it to "UTF8". */
1326 public final static String DEFAULT_FILENAME_ENCODING = null;
1327
1328 /** Default value for parameter "highQualityPreview". */
1329 public final static boolean DEFAULT_HIGH_QUALITY_PREVIEW = false;
1330
1331 /** Default value for parameter "httpUploadParameterName". */
1332 public final static String DEFAULT_HTTP_UPLOAD_PARAMETER_NAME = "File";
1333
1334 /** Default value for parameter "httpUploadParameterName". */
1335 public final static String DEFAULT_HTTP_UPLOAD_PARAMETER_TYPE = HTTPUPLOADPARAMETERTYPE_ITERATION;
1336
1337 /** Default value for parameter "lookAndFeel". */
1338 public final static String DEFAULT_LOOK_AND_FEEL = "";
1339
1340 /** Default value for parameter "maxChunkSize". */
1341 public final static long DEFAULT_MAX_CHUNK_SIZE = Long.MAX_VALUE;
1342
1343 /**
1344 * Default value for parameter "maxFileSize". Take care of this parameter if chunk upload is activated! See comment
1345 * above.
1346 */
1347 public final static long DEFAULT_MAX_FILE_SIZE = Long.MAX_VALUE;
1348
1349 /** Default value for parameter "maxPicWidth". */
1350 public final static int DEFAULT_MAX_WIDTH = Integer.MAX_VALUE;
1351
1352 /** Default value for parameter "maxPicHeight". */
1353 public final static int DEFAULT_MAX_HEIGHT = Integer.MAX_VALUE;
1354
1355 /**
1356 * Default value for parameter "maxPicHeight". Note: the CoppermineUploadPolicy forces it to 1.
1357 */
1358 public final static int DEFAULT_NB_FILES_PER_REQUEST = 1;
1359
1360 /**
1361 * Default value for parameter "pictureCompressionQuality".
1362 */
1363 public final static float DEFAULT_PICTURE_COMPRESSION_QUALITY = (float) 0.8;
1364
1365 /**
1366 * Default value for parameter "pictureCompressionQuality".
1367 */
1368 public final static boolean DEFAULT_PICTURE_TRANSMIT_METADATA = false;
1369
1370 /**
1371 * Default value for parameter "postURL".
1372 */
1373 public final static String DEFAULT_POST_URL = null;
1374
1375 /**
1376 * Default value for parameter "readCookieFromNavigator".
1377 */
1378 public final static boolean DEFAULT_READ_COOKIE_FROM_NAVIGATOR = true;
1379
1380 /**
1381 * Default value for parameter "readUserAgentFromNavigator".
1382 */
1383 public final static boolean DEFAULT_READ_USER_AGENT_FROM_NAVIGATOR = true;
1384
1385 /**
1386 * Default value for parameter "realMaxPicWidth".
1387 */
1388 public final static int DEFAULT_REAL_MAX_WIDTH = Integer.MAX_VALUE;
1389
1390 /**
1391 * Default value for parameter "realMaxPicHeight".
1392 */
1393 public final static int DEFAULT_REAL_MAX_HEIGHT = Integer.MAX_VALUE;
1394
1395 /**
1396 * Default value for parameter "retryMaxNumberOf".
1397 */
1398 public final static int DEFAULT_RETRY_MAX_NUMBER_OF = 1;
1399
1400 /**
1401 * Default value for parameter "retryNbSecondsBetween".
1402 */
1403 public final static int DEFAULT_RETRY_NB_SECONDS_BETWEEN = 30;
1404
1405 /**
1406 * Default value for parameter "serverProtocol".
1407 */
1408 public final static String DEFAULT_SERVER_PROTOCOL = "HTTP/1.1";
1409
1410 /**
1411 * Default value for the sendMD5Sum applet parameter
1412 */
1413 public final static boolean DEFAULT_SEND_MD5_SUM = false;
1414
1415 /**
1416 * Default value for parameter "showLogWindow".
1417 */
1418 public final static String DEFAULT_SHOW_LOGWINDOW = "true";
1419
1420 /**
1421 * Default value for parameter "showStatusBar".
1422 */
1423 public final static boolean DEFAULT_SHOW_STATUSBAR = true;
1424
1425 /**
1426 * Default value for parameter "sslVerifyCert"
1427 */
1428 public final static String DEFAULT_SPECIFIC_HEADERS = null;
1429
1430 /**
1431 * Default value for parameter "sslVerifyCert"
1432 */
1433 public final static String DEFAULT_SSL_VERIFY_CERT = "none";
1434
1435 /**
1436 * Default value for parameter "stringUploadError".
1437 *
1438 * @since 2.9.2rc4
1439 */
1440 public final static String DEFAULT_STRING_UPLOAD_ERROR = "^ERROR: (.*)$";
1441
1442 /**
1443 * Default value for parameter "stringUploadSuccess". Note: was ".* 200 OK$" before 2.9.0
1444 */
1445 public final static String DEFAULT_STRING_UPLOAD_SUCCESS = "^SUCCESS$";
1446
1447 /**
1448 * Default value for parameter "stringUploadWarning".
1449 */
1450 public final static String DEFAULT_STRING_UPLOAD_WARNING = "^WARNING: (.*)$";
1451
1452 /**
1453 * Default value for parameter "targetPictureFormat".
1454 */
1455 public final static String DEFAULT_TARGET_PICTURE_FORMAT = null;
1456
1457 /**
1458 * default value for parameter "keepOriginalFileExtensionForConvertedImages"
1459 */
1460 public final static boolean DEFAULT_KEEP_ORIG_EXTENSION = false;
1461
1462 /**
1463 * Default value for parameter "uploadPolicy".
1464 */
1465 public final static String DEFAULT_UPLOAD_POLICY = "DefaultUploadPolicy";
1466
1467 /**
1468 * Default value for parameter "urlToSendErrorTo".
1469 */
1470 public final static String DEFAULT_URL_TO_SEND_ERROR_TO = null;
1471
1472 /**
1473 * Default value for parameter "formdata"
1474 *
1475 * @since 2.9.2rc4
1476 */
1477 public final static String DEFAULT_FORMDATA = null;
1478
1479 /***************************************************************************/
1480 /******************** MISC CONSTANTS ***************************************/
1481 /***************************************************************************/
1482
1483 /**
1484 * Indicating that the applet is currently waiting for the user, to select files or start an uploading.
1485 */
1486 public final static int EXEC_STATUS_READY = 1;
1487
1488 /** Indicating that the applet is currently uploading files */
1489 public final static int EXEC_STATUS_UPLOADING = 2;
1490
1491 /***************************************************************************
1492 * ************************************************************************* ********************* LIST OF METHODS
1493 * ********************************** *************************************************************************
1494 **************************************************************************/
1495
1496 /**
1497 * This method allows the upolad policy to override the content of the applet part that is above the file list,
1498 * called here the 'top panel'. That is: the part that contains the Browse, Remove and RemoveAll buttons. The
1499 * default implementation is defined in
1500 * {@link wjhk.jupload2.policies.DefaultUploadPolicy#createTopPanel(JButton, JButton, JButton, JUploadPanel)} . <BR>
1501 * You can see an example in the {@link PictureUploadPolicy#createTopPanel(JButton, JButton, JButton, JUploadPanel)}
1502 * upload policy implementation. <BR>
1503 * <B>Note:</B> This method is called by the {@link DefaultUploadPolicy#addComponentsToJUploadPanel(JUploadPanel)}
1504 * method. If you create an upload policy that overrides the addComponentsToJUploadPanel method, it's up to you to
1505 * call it.
1506 *
1507 * @param browse The default browse button.
1508 * @param remove The default removeSelected button.
1509 * @param removeAll The default removeAll button.
1510 * @param mainPanel The panel that contains all objects.
1511 * @return the topPanel, that will be displayed on the top of the Applet.
1512 */
1513 public JPanel createTopPanel(JButton browse, JButton remove, JButton removeAll, JUploadPanel mainPanel);
1514
1515 /**
1516 * This method is called to create the progress panel. The default implementation is defined in
1517 * {@link wjhk.jupload2.policies.DefaultUploadPolicy#createProgressPanel(JProgressBar, JProgressBar, JButton, JButton, JUploadPanel)}
1518 * .
1519 *
1520 * @param preparationProgressBar The default preparation progress bar.
1521 * @param uploadProgressBar The default upload progress bar.
1522 * @param uploadButton The default upload button.
1523 * @param stopButton The default stop button.
1524 * @param mainPanel The panel that contains all objects.
1525 * @return the topPanel, that will be displayed on the top of the Applet.
1526 */
1527 public JPanel createProgressPanel(JProgressBar preparationProgressBar, JProgressBar uploadProgressBar,
1528 JButton uploadButton, JButton stopButton, JUploadPanel mainPanel);
1529
1530 /**
1531 * This method is used to create a new status bar. The default implementation is defined in
1532 * {@link wjhk.jupload2.policies.DefaultUploadPolicy#createStatusBar(JLabel, JUploadPanel)} .
1533 *
1534 * @param statusContent The status bar content
1535 * @param mainPanel The panel that contains all objects.
1536 * @return the topPanel, that will be displayed on the top of the Applet.
1537 */
1538 public JPanel createStatusBar(JLabel statusContent, JUploadPanel mainPanel);
1539
1540 /**
1541 * This methods allow the upload policy to override the default disposition of the components on the applet.<br>
1542 * There are some utility methods to style file panel elements (font/color), see
1543 * {@link wjhk.jupload2.gui.filepanel.FilePanel}.
1544 *
1545 * @param jUploadPanel The main applet panel.
1546 * @see #createTopPanel(JButton, JButton, JButton, JUploadPanel)
1547 */
1548 public void addComponentsToJUploadPanel(JUploadPanel jUploadPanel);
1549
1550 /**
1551 * This methods creates a new FileData instance (or one of its inherited classes), and return it to the caller.
1552 *
1553 * @param file The file used to create the FileData instance. This method is called once for each file selected by
1554 * the user, even if the user added several files in one 'shot'.
1555 * @param root An optional toplevel directory of a hierarchy (can be null).
1556 * @return A FileData instance. The exact class depends on the currentUploadPolicy. Can be null, if the policy
1557 * performs checks, and the given file is not Ok for these controls. See
1558 * {@link PictureUploadPolicy#createFileData(File,File)} for an example. It's up to the upload policy to
1559 * display a message to inform the user that this file won't be added to the file list.
1560 * @throws JUploadExceptionStopAddingFiles The exception is not really an error. It allows an easy way to indicates
1561 * that the applet should stop adding files when the user clicked on the 'Cancel' button.
1562 */
1563 public FileData createFileData(File file) throws JUploadExceptionStopAddingFiles;
1564
1565 /**
1566 * This method displays the applet parameter list, according to the current debugLevel. It is called by the
1567 * {@link #setDebugLevel(int)} method. It should be override by any subclasses, that should display its own
1568 * parameters, then call <i>super.displayParameterStatus()</i>.
1569 */
1570 public void displayParameterStatus();
1571
1572 /**
1573 * Reaction to the applet start. This method was added from the patch 3035735 given by Tsukasa Hamano (SF login:
1574 * cuspy). Its aim is to move all call to JSObject from the applet.init() method to the applet.start() method. This
1575 * prevents a crash, under Safari.
1576 */
1577 public void start();
1578
1579 /**
1580 * This method is called by the {@link JUploadPanel#updateButtonState()} method, when the execution status of the
1581 * applet changes. This allow the applet to manage specific GUI items, depending on the current execution status of
1582 * the applet.
1583 *
1584 * @param executionStatus One of the EXEC_STATUS_XXX constant.
1585 */
1586 public void updateButtonState(int executionStatus);
1587
1588 // //////////////////////////////////////////////////////////////////////////////////////////////
1589 // /////////////////// getters / setters
1590 // //////////////////////////////////////////////////////////////////////////////////////////////
1591
1592 /**
1593 * This allow runtime modifications of properties. With this method, you can change any applet parameter after the
1594 * applet initilization, with JavaScript for instance. If the applet parameters given in <i>prop</i> is not managed
1595 * by this method, a warning is displayed in the log window.
1596 *
1597 * @param prop The applet parameter name.
1598 * @param value The new value for this parameter. If the value is not valid (for instance <i>aaa</i> for a number),
1599 * a warning is displayed in the log window, and the existing value is not changed.
1600 * @throws JUploadException
1601 * @exception JUploadExceptionStopAddingFiles indicates that the applet should stop strying adding the current file
1602 * selection. Useful for instance, when a user drop a directory, full of unallowed file: it's
1603 * annoying for the user to click 'Ok' for each file in the alert box.
1604 */
1605 public void setProperty(String prop, String value) throws JUploadException;
1606
1607 /**
1608 * Retrieves the current value for the afterUploadURL applet parameter.
1609 *
1610 * @return The current value for he afterUploadURL applet parameter.
1611 */
1612 public String getAfterUploadURL();
1613
1614 /**
1615 * Retrieves the current value for allowHttpPersistent
1616 *
1617 * @return Current value for allowHttpPersistent
1618 */
1619 public boolean getAllowHttpPersistent();
1620
1621 /**
1622 * Retrieves the current value for allowedFileExtensions *
1623 *
1624 * @return Current value for allowedFileExtensions
1625 */
1626 public String getAllowedFileExtensions();
1627
1628 /**
1629 * A useful function, that has nothing to do with an upload policy. But it is useful to have it here, as the
1630 * uploadPolicy is known everywhere in the applet.
1631 *
1632 * @return Reference to the current JUpload context.
1633 */
1634 public JUploadContext getContext();
1635
1636 /**
1637 * Set the current directory.
1638 *
1639 * @param currentBrowsingDirectoryParam The directory that will be the current one, the next time the file chooser
1640 * is opened.
1641 * @see #getCurrentBrowsingDirectory()
1642 * @deprecated
1643 */
1644 public void setCurrentBrowsingDirectory(File currentBrowsingDirectoryParam);
1645
1646 /**
1647 * Set the current directory.
1648 *
1649 * @param currentBrowsingDirectoryParam The directory that will be the current one, the next time the file chooser
1650 * is opened. This directory may begin with ~/ or ~\
1651 * @see #getCurrentBrowsingDirectory()
1652 */
1653 public void setCurrentBrowsingDirectory(String currentBrowsingDirectoryParam);
1654
1655 /**
1656 * Returns the current browsing directory, that is: the directory that will be current the next time the file
1657 * chooser is opened. It is initialized with the browsingDirectory applet parameter. Then, it contains the last
1658 * directory used in the file chooser.
1659 *
1660 * @return The directory that will be the current one, the next time the file chooser is opened.
1661 */
1662 public File getCurrentBrowsingDirectory();
1663
1664 /**
1665 * Returns the currently choosen format for date. It must be compatible with the SimpleDateFormat standard Java
1666 * class.
1667 *
1668 * @return The date format.
1669 */
1670 public String getDateFormat();
1671
1672 /**
1673 * This method indicate whether or not the debug messages must be displayed. Default is no debug (0). <br>
1674 * To activate the debug, add a 'debugLevel' parameter to the applet (with 1 to n value), or call this method.
1675 * Currently, level used in the code are between 0 (no debug) and 100 (max debug). <br>
1676 * With a 0 value, no debug messages will be displayed. The {@link DefaultUploadPolicy}.addMsgToDebugBufferString
1677 * method stores all debug output in a BufferString.
1678 *
1679 * @param debugLevel The new debugLevel.
1680 * @see DefaultUploadPolicy#sendDebugInformation(String, Exception)
1681 */
1682 public void setDebugLevel(int debugLevel);
1683
1684 /**
1685 * This method returns the current debug level.
1686 *
1687 * @return The current debug level
1688 * @see #setDebugLevel(int)
1689 */
1690 public int getDebugLevel();
1691
1692 /**
1693 * Getter for the fileFilterName property.
1694 *
1695 * @return Stored value for fileFilterName
1696 * @see UploadPolicy#PROP_FILE_FILTER_NAME
1697 */
1698 public String getFileFilterName();
1699
1700 /**
1701 * Getter for the fileChooserIconFromFileContent applet parameter.
1702 *
1703 * @return Stored value for fileChooserIconFromFileContent
1704 * @see #PROP_FILE_CHOOSER_ICON_FROM_FILE_CONTENT
1705 */
1706 public int getFileChooserIconFromFileContent();
1707
1708 /**
1709 * Getter for the fileChooserIconSize applet parameter.
1710 *
1711 * @return Stored value for fileChooserIconSize
1712 * @see #PROP_FILE_CHOOSER_ICON_SIZE
1713 */
1714 public int getFileChooserIconSize();
1715
1716 /**
1717 * Getter for the fileListViewMode applet parameter.
1718 *
1719 * @return The mode for displaying the file list (flat or tree view)
1720 */
1721 public FilePanel.FileListViewMode getFileListViewMode();
1722
1723 /**
1724 * Setter for the fileListViewMode applet parameter: it can be changed at runtime, by the user.
1725 *
1726 * @return The mode for displaying the file list (flat or tree view)
1727 */
1728 public void setFileListViewMode(FilePanel.FileListViewMode fileListViewMode);
1729
1730 /**
1731 * Returns the encoding that should be used for the filename. This encoding has no impact on the content of the file
1732 * that will be uploaded.
1733 *
1734 * @return The encoding name, like UTF-8 (see the Charset JDK documentation).
1735 */
1736 public String getFilenameEncoding();
1737
1738 /**
1739 * Returns the current value for the ftpCreateDirectoryStructure applet parameter.
1740 *
1741 * @return The current value of ftpCreateDirectoryStructure
1742 */
1743 public boolean getFtpCreateDirectoryStructure();
1744
1745 /**
1746 * Returns the current value for the ftpTransfertBinary applet parameter.
1747 *
1748 * @return The current value of ftpTransfertBinary
1749 */
1750 public boolean getFtpTransfertBinary();
1751
1752 /**
1753 * Returns the current value for the ftpTransfertPassive applet parameter.
1754 *
1755 * @return The current value of ftpTransfertPassive
1756 */
1757 public boolean getFtpTransfertPassive();
1758
1759 /**
1760 * This method sets the current language to take into account. It loads the lang resourceBundle, which will allow
1761 * the applet to display the texts in the correct language.
1762 *
1763 * @param lang The new language to take into account. See the java.util.Locale(String) constructor for a list of
1764 * valid values.
1765 */
1766 public void setLang(String lang);
1767
1768 /**
1769 * Returns the value of the applet parameter maxChunkSize (see above for a description of all applet parameters)
1770 *
1771 * @return the current value of maxChunkSize.
1772 */
1773 public long getMaxChunkSize();
1774
1775 /**
1776 * Returns the value of the applet parameter maxFileSize (see above for a description of all applet parameters)
1777 *
1778 * @return the current value of maxFileSize.
1779 */
1780 public long getMaxFileSize();
1781
1782 /**
1783 * This function returns the number of files should be uploaded during one access to the server. If negative or 0,
1784 * all files are to be uploaded in one HTTP request. If positive, each HTTP upload contains this number of files.
1785 * The last upload request may contain less files. <br>
1786 * Examples :
1787 * <UL>
1788 * <li>If 1 : files are uploaded file by file.
1789 * <li>If 5 : files are uploaded 5 files by 5 files. If 12 files are uploaded, 3 HTTP upload are done, containing 5,
1790 * 5 and 2 files.
1791 * </UL>
1792 *
1793 * @return Returns the maximum number of files, to download in one HTTP request.
1794 */
1795 public int getNbFilesPerRequest();
1796
1797 /**
1798 * Return the current value of readUserAgentFromNavigator
1799 *
1800 * @return Current value of readUserAgentFromNavigator
1801 */
1802 public boolean getReadUserAgentFromNavigator();
1803
1804 /**
1805 * Return the current value of retryMaxNumberOf
1806 *
1807 * @return Current value of retryMaxNumberOf
1808 */
1809 public int getRetryMaxNumberOf();
1810
1811 /**
1812 * Return the current value of retryNbSecondsBetween
1813 *
1814 * @return Current value of retryNbSecondsBetween
1815 */
1816 public int getRetryNbSecondsBetween();
1817
1818 /**
1819 * Return the current value of readCookieFromNavigator
1820 *
1821 * @return Current value of readCookieFromNavigator
1822 */
1823 public boolean getReadCookieFromNavigator();
1824
1825 /**
1826 * Get the target URL for upload.
1827 *
1828 * @return Should be valid URL...
1829 */
1830 public String getPostURL();
1831
1832 /**
1833 * The URL can change during the life of our policy ...
1834 *
1835 * @param postURL
1836 * @throws JUploadException
1837 */
1838 public void setPostURL(String postURL) throws JUploadException;
1839
1840 /**
1841 * Return the target, specified as applet parameter "afterUploadTarget"
1842 *
1843 * @return the specified target.
1844 */
1845 public String getAfterUploadTarget();
1846
1847 /**
1848 * HTTP protocol that should be used to send the HTTP request. Currently, this is mainly used by
1849 * {@link wjhk.jupload2.policies.CoppermineUploadPolicy}, as the coppermine control that the protocol used for each
1850 * HTTP request is the same as the one used during the session creation. It is used in the default policy, as it
1851 * could be used elsewhere. <br>
1852 * Default is : HTTP/1.1
1853 *
1854 * @return The selected server protocol.
1855 */
1856 public String getServerProtocol();
1857
1858 /**
1859 * @param serverProtocol The protocol is set from the postURL. For HTTP URL, a HEAD request is done toward the
1860 * server, to check if any temporary redirection is occuring.
1861 */
1862 public void setServerProtocol(String serverProtocol);
1863
1864 /**
1865 * MD5Sum allows the server to control that the file has been correctly uploaded. This is interesting, when
1866 * uploading in chunk mode. But calculating this can be long, for big files.
1867 *
1868 * @return true or false, whether the md5sum should be processed and sent to the server.
1869 */
1870 public boolean getSendMD5Sum();
1871
1872 /**
1873 * MD5Sum allows the server to control that the file has been correctly uploaded. This is interesting, when
1874 * uploading in chunk mode. But calculating this can be long, for big files.
1875 *
1876 * @param sendMD5Sum true or false, whether the md5sum should be processed and sent to the server.
1877 */
1878 public void setSendMD5Sum(boolean sendMD5Sum);
1879
1880 /**
1881 * Retrieves SSL verification mode.
1882 *
1883 * @return The current SSL verification mode.
1884 */
1885 public int getSslVerifyCert();
1886
1887 /**
1888 * @param showLogWindow The show window status to set.
1889 * @see #getShowLogWindow()
1890 */
1891 public void setShowLogWindow(String showLogWindow);
1892
1893 /**
1894 * Indicate whether the log window should be shown. It may be convenient to hide it, as it contains mostly debug
1895 * information. But it still is the only place where possible errors and warnings are shown.<br>
1896 * Default is : true
1897 *
1898 * @return The current value for the <i>showStatusBar</i> applet parameter.
1899 */
1900 public String getShowLogWindow();
1901
1902 /**
1903 * Returns the list of specific headers, that will be added to all HTTP request to the server.
1904 *
1905 * @return List of specific headers, with a \r\n at the end of each header.
1906 */
1907 public String getSpecificHeaders();
1908
1909 /**
1910 * Get the original name of the file on the disk. This function can encode the filename (see the filenameEncoding
1911 * parameter). By default, the original filename is returned.
1912 *
1913 * @param fileData The file data whose upload file name must be calculated.
1914 * @param index index of the file in the current request to the server (from 0 to n)
1915 * @return The filename the is given in the filename part of the Content-Disposition header.
1916 * @throws JUploadException
1917 */
1918 public String getUploadFilename(FileData fileData, int index) throws JUploadException;
1919
1920 /**
1921 * Get an upload filename, that is to be send in the HTTP upload request. This is the name part of the
1922 * Content-Disposition header. That is: this is the name under which you can manage the file (for instance in the
1923 * _FILES[$name] in PHP) and not the filename of the original file. <BR>
1924 * If you're using one of the core JUpload {@link UploadPolicy}, the value for this parameter is controled by the
1925 * applet parameters: targetPictureFormat and keepOriginalFileExtensionForConvertedImages.
1926 *
1927 * @param fileData The file data whose upload name must be calculated.
1928 * @param index index of the file in the current request to the server (from 0 to n)
1929 * @return The name part of the Content-Disposition header.
1930 * @throws JUploadException
1931 * @see #getUploadFilename(FileData, int)
1932 */
1933 public String getUploadName(FileData fileData, int index) throws JUploadException;
1934
1935 /**
1936 * Returns the current URL where error log must be posted. See <a href="#parameters">Parameters</a>
1937 *
1938 * @return the urlToSendErrorTo
1939 */
1940 public String getUrlToSendErrorTo();
1941
1942 /**
1943 * @param urlToSendErrorTo the urlToSendErrorTo to set
1944 * @throws JUploadException
1945 */
1946 public void setUrlToSendErrorTo(String urlToSendErrorTo) throws JUploadException;
1947
1948 /**
1949 * Retrieve the regular expression that will be tested against each line of the server answer. If one line matches
1950 * this expression, that upload is marked as failed. <br>
1951 *
1952 * @return The regular expression that must be run again each line of the http answer.
1953 */
1954 public String getStringUploadError();
1955
1956 /**
1957 * Get the regular expression that will be tested against each line of the server answer. If one line matches this
1958 * expression, that upload is marked as successful. <br>
1959 * The upload works this way:
1960 * <ol>
1961 * <li>Upload the selected file(s) to the server
1962 * <li>Get all the server HTTP response.
1963 * <li>The stringUploadSuccess regular expression is tested against each line from the server.
1964 * <li>If the above test gives a match, the upload is marked as successful. Else, the upload is marked as
1965 * unsuccessful, and a JUploadExceptionUploadFailure is thrown.
1966 * </ol>
1967 *
1968 * @return The regular expression that must be run again each line of the http answer.
1969 */
1970 public String getStringUploadSuccess();
1971
1972 /**
1973 * Retrieve the regular expression that will be tested against each line of the server answer. If one line matches
1974 * this expression, a warning message is displayed to the user. <br>
1975 *
1976 * @return The regular expression that must be run again each line of the http answer.
1977 * @see #getStringUploadError()
1978 * @see #getStringUploadSuccess()
1979 */
1980 public String getStringUploadWarning();
1981
1982 /**
1983 * Retrieve the applet's "formdata" parameter.
1984 *
1985 * @return The applet's formdata parameter.
1986 */
1987 public String getFormdata();
1988
1989 /**
1990 * Retrieve the applet's "httpUploadParameterName" parameter.
1991 *
1992 * @return The applet's httpUploadParameterName parameter.
1993 */
1994 public String getHttpUploadParameterName();
1995
1996 /**
1997 * Retrieve the applet's "httpUploadParameterType" parameter.
1998 *
1999 * @return The applet's httpUploadParameterType parameter.
2000 */
2001 public String getHttpUploadParameterType();
2002
2003 // //////////////////////////////////////////////////////////////////////////////////////////////
2004 // /////////////////// miscellaneous methods
2005 // //////////////////////////////////////////////////////////////////////////////////////////////
2006
2007 /**
2008 * Reaction by the upload policy, once the management of the dropped file(s) is finished, that is: after all the
2009 * dropped files have been successfully added to the file list.
2010 *
2011 * @param dropEvent The event containing the dropped file
2012 */
2013 public void afterFileDropped(DropTargetDropEvent dropEvent);
2014
2015 // MANAGEMENT OF THE FILE CHOOSER
2016
2017 /**
2018 * The creation of the file chooser is controled by the upload policy, to allow fine control of the way to select
2019 * files. For instance, the {@link PictureUploadPolicy} creates a file chooser, and add an accessory to preview
2020 * pictures.
2021 *
2022 * @return Return the specific file choose, according to this upload policy.
2023 */
2024 public JUploadFileChooser createFileChooser();
2025
2026 /**
2027 * This methods is called by the {@link JUploadFileFilter#accept(File)}. It allows the current upload policy to
2028 * filter files, according to any choosen applet behaviour. This filter applied only when using the fileChooser.
2029 * Files dropped onto the applet won't trigger this function.<br>
2030 * In the {@link DefaultUploadPolicy} upload policy, this filter is based on the applet parameter:
2031 * <i>allowedFileExtensions</i>.
2032 *
2033 * @param file Allows the applet to filter files from the file chooser.
2034 * @return true or false, whether the file is accepted or not.
2035 * @see JUploadPanel
2036 */
2037 public boolean fileFilterAccept(File file);
2038
2039 /**
2040 * Return a description for the FileFilter, according to the current upload policy.
2041 *
2042 * @return A description for the current filter
2043 */
2044 public String fileFilterGetDescription();
2045
2046 /**
2047 * Response for the {@link JUploadFileView#getIcon(File)}. Default is implemented in
2048 * {@link DefaultUploadPolicy#fileViewGetIcon(File)}, by returning null, which displays the default icon.
2049 *
2050 * @param file The file from which the icon should represent.
2051 * @return The resulting icon.
2052 */
2053 public Icon fileViewGetIcon(File file);
2054
2055 /**
2056 * This method changes the current mouse cursor to the wait one. It returns the old one so that, it can be restored,
2057 * once the work is done.
2058 *
2059 * @return The cursor that was active, before changing to the wait one.
2060 * @see #setCursor(Cursor)
2061 */
2062 public Cursor setWaitCursor();
2063
2064 /**
2065 * Changes the current mouse cursor. This method can be called at the end of a big treatement, to restore the cursor
2066 * returned by the {@link #setWaitCursor()}.
2067 *
2068 * @param cursor The cursor that must be set.
2069 * @return The cursor that was active before setting the new one. Can be used to restore its previous state.
2070 */
2071 public Cursor setCursor(Cursor cursor);
2072
2073 // //////////////////////////////////////////////////////////////////////////////////////////////
2074 // DISPLAY OF MESSAGES (ERROR, DEBUG ...)
2075 // //////////////////////////////////////////////////////////////////////////////////////////////
2076
2077 /**
2078 * This method allows the applet to post debug information to the website (see {@link #getUrlToSendErrorTo()}).
2079 * Then, it is possible to log the error, to send a mail...
2080 *
2081 * @param reason A string describing briefly the problem. The mail subject will be something like: Jupload Error
2082 * (reason)
2083 * @param exception The java exception that was raised, or null if no exception.
2084 */
2085 public void sendDebugInformation(String reason, Exception exception);
2086
2087 /**
2088 * log an error message, based on an exception. Will be logged in the log window, if defined. <BR>
2089 * The dialog box will only contain an Ok button. Same as caling: displayErr(e, JOptionPane.OK_OPTION);
2090 *
2091 * @param e The exception to report
2092 */
2093 public void displayErr(Exception e);
2094
2095 /**
2096 * log an error message, based on an exception. Will be logged in the log window, if defined.<BR>
2097 *
2098 * @param err The erreur message to be displayed. If null the exception (or it's cause if any) message is displayed.
2099 * @param e The exception to report
2100 * @param optionType One of the valid {@link JOptionPane} option types for the
2101 * {@link JOptionPane#showConfirmDialog(java.awt.Component, Object, String, int)} method:
2102 * OK_CANCEL_OPTION, YES_NO_OPTION, YES_NO_CANCEL_OPTION... -1 is also accepted, to only have the Ok
2103 * button. OK_OPTION is prohibited, as it has the same value as YES_NO_OPTION.
2104 * @return The XXX_OPTION, corresponding to the button clicked by the user.
2105 */
2106 public int displayErr(String err, Exception e, int optionType);
2107
2108 /**
2109 * log an error message. Will be logged in the log window, if defined. <BR>
2110 * The dialog box will only contain an Ok button.
2111 *
2112 * @param err The erreur message to be displayed.
2113 */
2114 public void displayErr(String err);
2115
2116 /**
2117 * log an error message. Will be logged in the log window, if defined. <BR>
2118 * The dialog box will only contain an Ok button.
2119 *
2120 * @param err The error message to be displayed.
2121 * @param e An exception. It's stacktrace is logged.
2122 */
2123 public void displayErr(String err, Exception e);
2124
2125 /**
2126 * log an info message. Will be logged in the log window, if defined.
2127 *
2128 * @param info The information message that will be displayed.
2129 */
2130 public void displayInfo(String info);
2131
2132 /**
2133 * log a warning message. Will be logged in the log window, if defined.
2134 *
2135 * @param warn The warning message that will be displayed.
2136 */
2137 public void displayWarn(String warn);
2138
2139 /**
2140 * log a debug message. Will be logged in the log window, if defined.
2141 *
2142 * @param debug The message to display.
2143 * @param minDebugLevel If the current debug level is superior or equals to minDebugLevel, the message will be
2144 * displayed. Otherwise, it will be ignored.
2145 */
2146 public void displayDebug(String debug, int minDebugLevel);
2147
2148 // Others
2149
2150 /**
2151 * Add an header to the list of headers that will be added to each HTTP upload request. This method is called from
2152 * specific uploadPolicies, which would need headers to be added to all uploads. These headers are used in
2153 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}.
2154 *
2155 * @param header
2156 * @see #onAppendHeader(ByteArrayEncoder)
2157 */
2158 public void addHeader(String header);
2159
2160 /**
2161 * Append specific headers for this upload (session cookies, for instance). This method is called while building
2162 * each upload HTTP request.
2163 *
2164 * @param sb The header {@link ByteArrayEncoder} where specific headers should be appended.
2165 * @return The {@link ByteArrayEncoder} given in parameters. This is allows to work like with StringBuffer.append
2166 * method: sb.append(s1).append(s2);
2167 * @throws JUploadIOException
2168 * @see #addHeader(String)
2169 * @see wjhk.jupload2.upload.FileUploadThread
2170 */
2171 public ByteArrayEncoder onAppendHeader(ByteArrayEncoder sb) throws JUploadIOException;
2172
2173 /**
2174 * This method is called each time a file is selected in the panel files. It allows, for instance, to preview a
2175 * picture {@link wjhk.jupload2.policies.PictureUploadPolicy}.
2176 *
2177 * @param fileData
2178 */
2179 public void onFileSelected(FileData fileData);
2180
2181 /**
2182 * Reaction when the user double click on a file, in the file list. Default is no reaction. In
2183 * {@link PictureUploadPolicy}, it will open a {@link PictureDialog}.
2184 *
2185 * @param fileData
2186 */
2187 public void onFileDoubleClicked(FileData fileData);
2188
2189 /**
2190 * Execute any action, that must be done before upload. For instance, {@link PictureUploadPolicy} disable the
2191 * rotation buttons during buttons. The {@link DefaultUploadPolicy#beforeUpload()} method just returns true.
2192 *
2193 * @return indicate if everything is ready for upload.
2194 */
2195 public boolean beforeUpload();
2196
2197 /**
2198 * This method returns true, if upload is a success. A HTTP response of "200 OK" indicates that the server response
2199 * is techically correct. But, it may be a functionnal error. For instance, the server could answer by a proper HTTP
2200 * page, that the user is no allowed to upload files. It's up to the uploadPolicy to check this, and answer true or
2201 * false to this method. <br>
2202 * This method is called once for each HTTP request toward the server. For instance, if the upload is done file by
2203 * file, and there are three files to upload, this method will be called three times. <br>
2204 * So this method is different from the {@link #afterUpload(Exception, String)}, that will be called only once in
2205 * this case, after the three calls to the checkUploadSuccess method.
2206 *
2207 * @param status The numeric response status (e.g. 200)
2208 * @param msg The status message from the first line of the response (e.g. "200 OK").
2209 * @param body The http body part (that is: the serverOuput without the http headers and the blank line that follow
2210 * them).
2211 * @return true (or an exception is raised, instead of returning false). This garantees that all cases are handled:
2212 * the compiler will indicate an error if the code can come to the end of the method, without finding a
2213 * 'return' or a throw exception. This return code can be ignored by the caller.
2214 * @throws JUploadException Thrown if the success conditions are not met.
2215 */
2216 public boolean checkUploadSuccess(int status, String msg, String body) throws JUploadException;
2217
2218 /**
2219 * This method is called after an upload, whether it is successful or not. This method is called once for each click
2220 * of the user on the 'upload' button. That is: if the nbFilesPerRequest is 2, and the user selected 5 files before
2221 * clicking on the 'upload' button. Then the afterUpload is called once the 5 files were uploaded to the server.
2222 *
2223 * @param e null if success, or the exception indicating the problem.
2224 * @param serverOutput The full server output, including the HTTP headers.
2225 * @throws JUploadException
2226 */
2227 public void afterUpload(Exception e, String serverOutput) throws JUploadException;
2228
2229 /**
2230 * Returns the current locale. It is the default value at startup, based on the local computer configuration. Then,
2231 * if the lang applet parameter is given, this method the Locale initialized from this lang parameter.
2232 *
2233 * @return The current Locale for the current policy.
2234 */
2235 public Locale getLocale();
2236
2237 /**
2238 * Retrieve a lang string, based on the file cointained in the wjhk.jupload2.lang package. This allows localization.
2239 *
2240 * @param key The key, whose associated text is to retrieve. This text must respect the constraints of the
2241 * {@link String#format(String, Object...)} method, that is called in the
2242 * {@link DefaultUploadPolicy#getLocalizedString(String, Object...)} implementation of this method.
2243 * @param args The optional parameters, that will replace the placeholders in the localized text identified by
2244 * 'key'.
2245 * @return The associated text.
2246 */
2247 public String getLocalizedString(String key, Object... args);
2248
2249 /**
2250 * Displays a MessageBox with a unique 'Ok' button, by calling the
2251 * {@link JOptionPane#showMessageDialog(java.awt.Component, Object)} method.
2252 *
2253 * @param key The string identifying the text to display, depending on the current language.
2254 * @see #alertStr(String)
2255 */
2256 public void alert(String key);
2257
2258 /**
2259 * Displays a MessageBox with a unique 'Ok' button, by calling the
2260 * {@link JOptionPane#showMessageDialog(java.awt.Component, Object)} method.
2261 *
2262 * @param str The full String that must be displayed to the user.
2263 * @see #alert(String)
2264 */
2265 public void alertStr(String str);
2266
2267 /**
2268 * Displays a MessageBox with a unique 'Ok' button, by calling the
2269 * {@link JOptionPane#showConfirmDialog(java.awt.Component, Object, String, int)} method.
2270 *
2271 * @param str The full String that must be displayed to the user.
2272 * @param optionTypes The options indicating the button to display. Valid options are the options valid for the
2273 * {@link JOptionPane#showConfirmDialog(java.awt.Component, Object, String, int)} method.
2274 * @return The JOptionConstant that indicates the button the user cliecked on (for instance OK_OPTION)
2275 * @see #alert(String)
2276 */
2277 public int confirmDialogStr(String str, int optionTypes);
2278
2279 /**
2280 * Indicates that an error occurs.
2281 *
2282 * @return The last Exception that occurs in the applet. null if no exception occurs.
2283 */
2284 public JUploadException getLastException();
2285
2286 /**
2287 * Retrieve the body of the last server response.
2288 *
2289 * @return The string containing the last server response (body);
2290 */
2291 public String getLastResponseBody();
2292
2293 /**
2294 * Retrieve the status/error message of the last server response.
2295 *
2296 * @return The string containing either the last server status or (if the error regex matches, the parsed error
2297 * message.
2298 */
2299 public String getLastResponseMessage();
2300 }