001: package de.jwic.upload;
002:
003: import java.io.*;
004:
005: /**
006: * Stellt eine empfängene Datei der Upload-Klasse da.
007: *
008: * Erstellungsdatum: (29.01.2002 09:09:12)
009: * @author Jens Bornemann
010: */
011: public class UploadFile {
012: private ByteArrayOutputStream buffer = null;
013: private String name = null;
014: private String path = null;
015: private java.io.File tmpFile = null;
016:
017: /**
018: * UploadFile - Stellt eine empfängene Datei der Upload-Klasse da.
019: */
020: public UploadFile() {
021: super ();
022: }
023:
024: /**
025: * Räumt das Object weg und eine eventuell erstellte Tmp-Datei.
026: * Erstellungsdatum: (16.01.2003 17:58:00)
027: */
028: public void destroy() {
029:
030: if (tmpFile != null) {
031: tmpFile.delete();
032: tmpFile = null;
033: }
034:
035: }
036:
037: /**
038: * Code to perform when this object is garbage collected.
039: *
040: * Any exception thrown by a finalize method causes the finalization to
041: * halt. But otherwise, it is ignored.
042: */
043: protected void finalize() throws Throwable {
044:
045: destroy();
046: super .finalize();
047: }
048:
049: /**
050: *
051: * Erstellungsdatum: (27.05.2002 11:39:23)
052: * @return java.lang.String
053: * @param fileName java.lang.String
054: */
055: private String findNewFileName(int number) {
056: String newFileName = getNameWithoutExtension() + "("
057: + Integer.toString(number) + ")." + getExtension();
058: File file = new File(getAbsolutePath());
059: File newFile = new File(file.getParent(), newFileName);
060: if (newFile.isFile() || newFile.isDirectory()) {
061: return findNewFileName(++number);
062: }
063: return newFileName;
064: }
065:
066: /**
067: * Absolute Dateipfad
068: * Erstellungsdatum: (29.01.2002 11:27:50)
069: * @return java.lang.String
070: */
071: private String getAbsolutePath() {
072: if (path == null || name == null)
073: return null;
074: String sep = File.separator;
075: if (path.endsWith(sep) || name.startsWith(sep)) {
076: sep = "";
077: }
078: return path + sep + name;
079: }
080:
081: /**
082: * Returns file extension of the uploaded file.
083: * Erstellungsdatum: (27.05.2002 11:42:56)
084: * @return java.lang.String
085: */
086: public String getExtension() {
087: int dot = name.lastIndexOf(".");
088: if (dot != -1) {
089: return name.substring(dot + 1);
090: }
091: return "";
092: }
093:
094: /**
095: * Dateiname mit Dateiendung
096: * Erstellungsdatum: (29.01.2002 11:23:32)
097: * @return java.lang.String
098: */
099: public String getName() {
100: return name;
101: }
102:
103: /**
104: *
105: * Erstellungsdatum: (27.05.2002 11:42:56)
106: * @return java.lang.String
107: */
108: private String getNameWithoutExtension() {
109: int dot = name.lastIndexOf(".");
110: if (dot != -1)
111: return name.substring(0, dot);
112: return name;
113: }
114:
115: /**
116: *
117: * Erstellungsdatum: (29.01.2002 09:11:45)
118: * @return int
119: */
120: OutputStream getOutputStream() {
121: if (buffer == null)
122: buffer = new ByteArrayOutputStream();
123: return buffer;
124: }
125:
126: /**
127: * Returns an InputStream of the uploaded file.
128: *
129: * @return InputStream
130: */
131: public InputStream getInputStream() throws IOException {
132: if (tmpFile != null) {
133: // Daten aus Tmp-Datei lesen
134: FileInputStream fis = new FileInputStream(tmpFile);
135: return fis;
136: } else if (buffer != null) {
137: // Daten aus Speicher lesen
138: ByteArrayInputStream bis = new ByteArrayInputStream(buffer
139: .toByteArray());
140: return bis;
141: } else {
142: // es gibt keine Daten
143: return new ByteArrayInputStream(new byte[0]);
144: }
145: }
146:
147: /**
148: *
149: * Erstellungsdatum: (04.02.2002 15:45:28)
150: * @return java.io.File
151: */
152: java.io.File getTmpFile() {
153: return tmpFile;
154: }
155:
156: /**
157: * Länge der Datei
158: * Bei fehlerhaftem Empfang -1
159: * Erstellungsdatum: (29.01.2002 09:11:45)
160: * @return int
161: */
162: public long length() {
163: if (tmpFile != null) {
164: return (int) tmpFile.length();
165: }
166: if (buffer != null) {
167: return buffer.size();
168: }
169: return -1;
170: }
171:
172: /**
173: * Setzen des Dateinamens
174: * Erstellungsdatum: (29.01.2002 11:23:32)
175: * @param newName java.lang.String
176: */
177: void setName(String newName) {
178: name = newName;
179: }
180:
181: /**
182: * Setzen des Pfades zur Datei
183: * Erstellungsdatum: (29.01.2002 11:27:50)
184: * @param newPath java.lang.String
185: */
186: boolean setPath(String newPath) {
187: boolean ret = true;
188:
189: File fPath = new File(newPath);
190: if (!fPath.isDirectory())
191: ret = fPath.mkdirs();
192:
193: path = fPath.getAbsolutePath();
194:
195: return ret;
196: }
197:
198: /**
199: *
200: * Erstellungsdatum: (04.02.2002 15:45:28)
201: * @param newTmpFile java.io.File
202: */
203: void setTmpFile(java.io.File newTmpFile) {
204: tmpFile = newTmpFile;
205: }
206:
207: /**
208: * Speichern der Datei im angegeben Pfad unter angegebenem Dateiname
209: *
210: * Wurde kein Verzeichnis angegeben, ist das Verzeichnis wie in der Upload-Klasse definiert.
211: * Wurde kein Dateiname angegeben, wird dieser aus dem Servlet-InputStream übernommen.
212: * Existiert eine Datei oder ein Verzeichniss unter dem Namen schon, wird ein "(1...x)" angehängt.
213: * Erstellungsdatum: (29.01.2002 09:11:25)
214: * Rückgabe die geschriebenen Bytes, oder -1 wenn Verbindung zum Client verloren ging
215: * @return int
216: */
217: int write() throws IOException {
218: int written = -1;
219:
220: FileInputStream fis = null;
221: File testFile = new File(getAbsolutePath());
222: if (testFile.isFile() || testFile.isDirectory())
223: setName(findNewFileName(1));
224:
225: FileOutputStream fos = new FileOutputStream(getAbsolutePath());
226:
227: try {
228: if (tmpFile == null) {
229: fos.write(buffer.toByteArray());
230: written = buffer.size();
231: } else {
232: fis = new FileInputStream(tmpFile);
233:
234: byte buf[] = new byte[64 * 1024];
235: written = 0;
236: int read = 0;
237: while ((read = fis.read(buf)) != -1) {
238: fos.write(buf, 0, read);
239: written += read;
240: }
241: }
242: } finally {
243: if (fis != null)
244: fis.close();
245: if (fos != null) {
246: fos.flush();
247: fos.close();
248: }
249: destroy();
250: }
251:
252: return written;
253: }
254:
255: /**
256: * Speichern der Datei unter 'absolutePath', ruft write() auf
257: * Rückgabe die geschriebenen Bytes, oder -1 wenn Verbindung zum Client verloren ging
258: * Erstellungsdatum: (29.01.2002 09:11:25)
259: * @return int
260: */
261: int write(String absolutePath) throws IOException {
262: File pDir = new File(absolutePath);
263: setPath(pDir.getParentFile().getPath());
264: setName(pDir.getName());
265:
266: return write();
267: }
268:
269: /**
270: * Speichern der Datei unter 'path' als 'name', ruft setPath(path), setName(name) und write() auf
271: * Rückgabe die geschriebenen Bytes, oder -1 wenn Verbindung zum Client verloren ging
272: * Erstellungsdatum: (29.01.2002 09:11:25)
273: * @return int
274: */
275: int write(String sPath, String sName) throws IOException {
276: setPath(sPath);
277: setName(sName);
278:
279: return write();
280: }
281: }
|