67,513
社区成员
发帖
与我相关
我的任务
分享
public class FileFormAnalysis implements FormAnalysis {
private static final LogUtil LOG = new LogUtil(LogFactory.getLog(
FileFormAnalysis.class));
/**
* 获取上传各文件文件名所在域的字节数组的迭代器
* @param request 请求
* @return 字节数组的迭代器
* @throws IOException
*/
@Override
public Iterator<Field> analysis(HttpServletRequest request)
throws IOException {
InputStream input = request.getInputStream();
//没有设定文件字符集的话,默认是'iso8859_1'
String charset = UploadBytes.getCharset(request);
//获取表单域的分隔符
byte[] boundarys = UploadBytes.getBoundaryStr(request).getBytes(charset);
return new FieldIterator(input, charset, boundarys);
}
/**
* 获取上传文件迭代器的实现
*/
private class FieldIterator implements Iterator<Field> {
private String charset;
private byte[] boundarys;
private InputStream input;
private ByteArrayOutputStream output;
private Field currentField;
private List<Field> currentNextFields;
int num = 0;
private FieldIterator(InputStream input, String charset,
byte[] boundarys) {
this.input = input;
this.charset = charset;
this.boundarys = boundarys;
this.output = new ByteArrayOutputStream();
}
@Override
public boolean hasNext() {
currentField = null;//初始当前域置为空
//如果一次取得域有多个
if (currentNextFields != null && !currentNextFields.isEmpty()) {
currentField = currentNextFields.remove(0);
return true;
}
int r = -1;
byte[] buff = new byte[1024];
List<byte[]> fieldList = null;
List<byte[]> fileList = null;
try {
while ((r = input.read(buff)) != -1) {
output.write(buff, 0, r);
//获取上传文件的各域的字节列表
fieldList = UploadBytes.findFiled(boundarys, output);
if (fieldList != null && !fieldList.isEmpty()) {
//获取实际上传文件字节列表
fileList = UploadBytes.getFilesByteList(fieldList,
charset);
if (fileList != null && !fileList.isEmpty()) {
break;
}
}
}
if (fileList == null || fileList.isEmpty()) {
return false;
}
if (fileList.size() > 1) {//如果该长度范围有多个域时
currentNextFields = new ArrayList<Field>(fileList.size());
}
Field field = null;
for (int i = 0; i < fileList.size(); i++) {
//获取上传文件的实际内容的Field对象
field = UploadBytes.getField(fileList.get(i), charset);
if (i == 0) {//该范围长度有一个域的情况
currentField = field;
} else {//如果该长度范围有多个域的情况
currentNextFields.add(field);
}
}
} catch (Exception ex) {
LOG.errorLog(ex);
return false;
}
return currentField == null ? false : true;
}
@Override
public Field next() {
return this.currentField;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
}
<form enctype="multipart/form-data" action="etnetChina/etnetUpload" method="post">
<input type="file" name="file"/>
<input type="text" name="text" />
<input type="submit" value="上传文件" />
</form>
text
This upload test.
POST /Upload HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------205147955511612195381301874305
Content-Length: 243
-----------------------------205147955511612195381301874305
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
[\r\n]
text
This upload test.
-----------------------------205147955511612195381301874305
Content-Disposition: form-data; name="text"
[\r\n]
test
-----------------------------205147955511612195381301874305--
[\r\n]