您的位置:首页 > 编程语言 > Java开发

java文件上传小结

2011-01-12 11:04 459 查看
一.页面层:

html页面

<form name="frmUpload" enctype="multipart/form-data" action="" method="post" style="margin: 0px">
<input type="hidden" name="action" value="upload">
<input type="hidden" name="path" value="/opt/tmp/">
<input type="file" name="cqqUploadFile" size="50">
<input type="submit" name="submit" value="commit">
</form>

二.代码层:

1.最原始处理对于流进行处理 ,不用第三方控件.

(全部代码参考:http://blog.csdn.net/fjfdszj/archive/2011/01/12/6130272.aspx)

int bstart = request.getContentType().lastIndexOf("oundary=");
String bound = request.getContentType().substring(bstart + 8);
int clength = request.getContentLength();
Hashtable ht = parser.processData(request.getInputStream(), bound, tempdir, clength);

//代码片段

public Hashtable processData(ServletInputStream is, String boundary, String saveInDir,
int clength) throws IllegalArgumentException, IOException {
if (is == null) throw new IllegalArgumentException("InputStream");
if (boundary == null || boundary.trim().length() < 1) throw new IllegalArgumentException(
"/"" + boundary + "/" is an illegal boundary indicator");
boundary = "--" + boundary;
StringTokenizer stLine = null, stFields = null;
FileInfo fileInfo = null;
Hashtable dataTable = new Hashtable(5);
String line = null, field = null, paramName = null;
boolean saveFiles = (saveInDir != null && saveInDir.trim().length() > 0);
boolean isFile = false;
if (saveFiles) { // Create the required directory (including parent dirs)
File f = new File(saveInDir);
f.mkdirs();
}
line = getLine(is);
if (line == null || !line.startsWith(boundary)) throw new IOException(
"Boundary not found; boundary = " + boundary + ", line = " + line);
while (line != null) {
if (line == null || !line.startsWith(boundary)) return dataTable;
line = getLine(is);
if (line == null) return dataTable;
stLine = new StringTokenizer(line, ";/r/n");
if (stLine.countTokens() < 2) throw new IllegalArgumentException(
"Bad data in second line");
line = stLine.nextToken().toLowerCase();
if (line.indexOf("form-data") < 0) throw new IllegalArgumentException(
"Bad data in second line");
stFields = new StringTokenizer(stLine.nextToken(), "=/"");
if (stFields.countTokens() < 2) throw new IllegalArgumentException(
"Bad data in second line");
fileInfo = new FileInfo();
stFields.nextToken();
paramName = stFields.nextToken();
isFile = false;
if (stLine.hasMoreTokens()) {
field = stLine.nextToken();
stFields = new StringTokenizer(field, "=/"");
if (stFields.countTokens() > 1) {
if (stFields.nextToken().trim().equalsIgnoreCase("filename")) {
fileInfo.name = paramName;
String value = stFields.nextToken();
if (value != null && value.trim().length() > 0) {
fileInfo.clientFileName = value;
isFile = true;
}
else {
line = getLine(is); // Skip "Content-Type:" line
line = getLine(is); // Skip blank line
line = getLine(is); // Skip blank line
line = getLine(is); // Position to boundary line
continue;
}
}
}
else if (field.toLowerCase().indexOf("filename") >= 0) {
line = getLine(is); // Skip "Content-Type:" line
line = getLine(is); // Skip blank line
line = getLine(is); // Skip blank line
line = getLine(is); // Position to boundary line
continue;
}
}

2.由于struct2的org.apache.struts2.dispatcher.FilterDispatcher的拦截处理,所以用以上方法无法读取流文件中的信息.

采用如下方案:从multipart中取得上传的文件流

//multipart以此确认是上传的.action upload strAction.equals("upload")
if ((request.getContentType() != null)
&& (request.getContentType().toLowerCase()
.startsWith("multipart"))) {
//structs支持数据
MultiPartRequestWrapper mpRequest = (MultiPartRequestWrapper) request;
File[] files = mpRequest.getFiles("cqqUploadFile");
String[] names = mpRequest.getFileNames("cqqUploadFile");
String path = mpRequest.getParameter("path");
//组合路径
if (path != null && !path.endsWith(strSeparator))
path = path + strSeparator;

for (int i = 0; i < names.length; i++) {
File fl = files[i];
FileInputStream in1 = new FileInputStream(fl);

BufferedReader br = new BufferedReader(new InputStreamReader(in1,"gbk"));
FileOutputStream out1 = new FileOutputStream(path + names[i]);
Writer writer = new OutputStreamWriter(out1,"utf-8");
char[] buffer = new char[1024];
int c;

while ((c = br.read(buffer)) != -1) {
writer.write(buffer, 0, c);
}
writer.flush();

in1.close();
out1.close();
}

}
3.采用commons.fileupload中DiskFileUpload处理上传的文件

DiskFileUpload diskFileUpload = new DiskFileUpload(); // 允许文件最大长度
diskFileUpload.setSizeMax( 100*1024*1024 ); // 设置内存缓冲大小
diskFileUpload.setSizeThreshold( 4096 ); // 设置临时目录
diskFileUpload.setRepositoryPath( "c:/tmp" );
List fileItems = diskFileUpload.parseRequest( request ); //HttpServletRequest
Iterator iter = fileItems.iterator();
for( ; iter.hasNext(); ) {
FileItem fileItem = (FileItem) iter.next();
if( fileItem.isFormField() ) {
// 当前是一个表单项
out.println( "form field : " + fileItem.getFieldName() + ", " + fileItem.getString() );
} else {
// 当前是一个上传的文件
String fileName = fileItem.getName();
fileItem.write( new File("c:/uploads/"+fileName) );
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: