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 }