001: package de.jwic.upload;
002:
003: import java.io.FilterInputStream;
004: import java.io.IOException;
005: import javax.servlet.ServletInputStream;
006:
007: /**
008: * Repräsentiert den Inhalt der Multipart / from-data
009: */
010:
011: public class Content extends FilterInputStream {
012:
013: private String boundary;
014: private byte[] buf = new byte[64 * 1024]; // 64k
015: private int count;
016: private int pos;
017: private boolean eof;
018: private String filename;
019: private boolean isFile;
020: private String fieldname;
021:
022: /**
023: * Repräsentiert den Inhalt der Multipart / form-data
024: * Erstellungsdatum: (08.03.01 09:01:38)
025: * @param in javax.servlet.ServletInputStream
026: * @param boundary java.lang.String Grenzlinie. Zeigt den Anfang des nächsten Feldes an
027: * @param sFileName java.lang.String
028: * @param sFieldName java.lang.String
029: * @exception java.io.IOException
030: */
031:
032: public Content(ServletInputStream in, String boundary,
033: String sFileName, String sFieldName) {
034: super (in);
035: this .boundary = boundary;
036: this .isFile = (sFileName != null);
037: this .filename = sFileName;
038: this .fieldname = sFieldName;
039:
040: }
041:
042: /**
043: * Dateiende erreicht?
044: * @exception java.io.IOException
045: */
046: public int available() throws IOException {
047: int avail = (count - pos - 2) + in.available();
048: return (avail < 0 ? 0 : avail);
049: }
050:
051: /**
052: * Datei solange einlesen bis Dateiende erreicht.
053: * @exception java.io.IOException
054: */
055: public void close() throws IOException {
056: if (!eof) {
057: while (read(buf, 0, buf.length) != -1)
058: ; // nichts machen
059: }
060: }
061:
062: /**
063: * Datei bis zur nächsten Grenzlinie einlesen
064: * @exception java.io.IOException
065: */
066:
067: private void fill() throws IOException {
068: if (eof)
069: return;
070:
071: if (count > 0) {
072:
073: if (count - pos == 2) {
074: System.arraycopy(buf, pos, buf, 0, count - pos);
075: count -= pos;
076: pos = 0;
077: } else {
078: throw new IllegalStateException(
079: "fill() detected illegal buffer state");
080: }
081: }
082:
083: int read = 0;
084: while (count + boundary.length() + 2 < buf.length) {
085: read = ((ServletInputStream) in).readLine(buf, count,
086: buf.length - count);
087: if (read != -1) {
088: if (read >= boundary.length()) {
089: eof = true;
090: for (int i = 0; i < boundary.length(); i++) {
091: if (boundary.charAt(i) != buf[count + i]) {
092: eof = false;
093: break;
094: }
095: }
096: if (eof) {
097: break;
098: }
099: }
100: count += read;
101: } else {
102: eof = true;
103: }
104: }
105: }
106:
107: /**
108: * Gibt den Namen des aktuellen Feldes zurück
109: * @return java.lang.String
110: */
111: public String getFieldName() {
112: return fieldname;
113: }
114:
115: /**
116: * Gibt den Dateinamen zurück
117: */
118: public String getFileName() {
119: return filename;
120: }
121:
122: /**
123: * Beinhaltete der aktuelle Abschnitt eine Datei?
124: * @return boolen
125: */
126: public boolean isFile() {
127: return isFile;
128: }
129:
130: public int read() throws IOException {
131: if (count - pos <= 2) {
132: fill();
133: if (count - pos <= 2) {
134: return -1;
135: }
136: }
137: return buf[pos++] & 0xff;
138: }
139:
140: /**
141: * Daten Zeile für Zeile, Byte für Byte auslesen.
142: * @exception java.io.IOException
143: */
144: public int read(byte b[], int off, int len) throws IOException {
145: int total = 0;
146: if (len == 0) {
147: return 0;
148: }
149:
150: int avail = count - pos - 2;
151: if (avail <= 0) {
152: fill();
153: avail = count - pos - 2;
154: if (avail <= 0) {
155: return -1;
156: }
157: }
158: int copy = Math.min(len, avail);
159: System.arraycopy(buf, pos, b, off, copy);
160: pos += copy;
161: total += copy;
162:
163: while (total < len) {
164: fill();
165: avail = count - pos - 2;
166: if (avail <= 0) {
167: return total;
168: }
169: copy = Math.min(len - total, avail);
170: System.arraycopy(buf, pos, b, off + total, copy);
171: pos += copy;
172: total += copy;
173: }
174: return total;
175: }
176: }
|