fileupload.java

来自「java 文件 上传类 里面有5个文件 一班 都可以应付 直接用里面的方法就可以」· Java 代码 · 共 216 行

JAVA
216
字号
package FileUploadPkg;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.ServletInputStream;
import java.util.Dictionary;
import java.util.Hashtable;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileUpload {

private String savePath, filePath, contentType;
private Dictionary fields;
private String fileName,fileSuffix;
private int lineLen = 256;
/*
public  static void main(String[] args)
{
	FileUploadBean up = new FileUploadBean();
	System.out.println("11");
	System.out.println(up.getFileName());
}

*/

public String getFileName() {
	return fileName;
}
public String getFileSuffix() {
	return fileSuffix;
}
public String getFilePath() {
	return filePath;
}

public void setSavePath(String path) {
	//System.out.println("path:"+path);
	savePath = path;
	//System.out.println("savePath:"+savePath);
}

public String getContentType() {
	return contentType;
}

public String getFieldValue(String fieldName) {
	if (fields == null || fieldName == null)
		return null;
	return (String) fields.get(fieldName);
}

private void setFileName(String s) {
	if (s==null)
		return;

	//System.out.println("setFileName s:"+s);
	int pos = s.indexOf("; filename=\"");
	if (pos != -1) {
		filePath = s.substring(pos+12,s.length()-1);
		// Windows浏览器发送完整的文件路径和名字
		// 但Linux/Unix和Mac浏览器只发送文件名字
		pos = filePath.lastIndexOf("\\");
		if (pos != -1)
			fileName = filePath.substring(pos + 1);
		else
			fileName = filePath;
		pos = fileName.lastIndexOf(".");
		if(pos != -1)
			fileSuffix = fileName.substring(pos);
		else
			fileSuffix = ".tmp";
	}
	//System.out.println("setFileName filePath:"+filePath);
	//System.out.println("setFileName fileName:"+fileName);
}
private void setContentType(String s) {
	if (s==null)
		return;

	int pos = s.indexOf(": ");
	if (pos != -1)
		contentType = s.substring(pos+2);
}

public void doUpload(HttpServletRequest request) throws IOException {
	ServletInputStream in = request.getInputStream();
/*	int readBytes = 0;
	int totalRead = 0;
    //字节数
    byte m_binArray[];
    int m_totalBytes;
    m_totalBytes = request.getContentLength();

    m_binArray = new byte[m_totalBytes];

    for(; totalRead < m_totalBytes; totalRead += readBytes)
        try
        {
            readBytes = in.read(m_binArray, totalRead, m_totalBytes - totalRead);
        }
        catch(Exception e)
        {
            System.out.println("Unable to upload.");
        }
        
    FileOutputStream fp = new FileOutputStream("d:\\form.txt");
    fp.write(m_binArray,0,m_totalBytes); 
    fp.close();
  */
        
 /*           	
	FileOutputStream fp = new FileOutputStream("d:\\form.txt");
	byte[] line = new byte[lineLen];
	int i = in.readLine(line, 0, lineLen);
	while(i != -1)
	{
		String str = new String(line,0,i);
		System.out.print(str);
		fp.write(line,0,i);
		i = in.readLine(line, 0, lineLen);
	}
	fp.close();
*/

	//String str;
	byte[] line = new byte[lineLen];
	int i = in.readLine(line, 0, lineLen);
	int i1 = 0;
	if (i < 3)
		return;
	int boundaryLength = i - 2;

	String boundary = new String(line, 0, boundaryLength); //-2丢弃换行字符	
	fields = new Hashtable();
	
	while (i != -1) {
		//str = new String(line,0,i);
		//System.out.println(new String(line,0,i));
		
		String newLine = new String(line, 0, i);
		if (newLine.startsWith("Content-Disposition: form-data; name=\"")) {
			if (newLine.indexOf("; filename=\"") != -1) {
				setFileName(new String(line, 0, i-2));
				if (fileName==null)
					return;
				
				i = in.readLine(line, 0, lineLen);//文件类型
				setContentType(new String(line, 0, i-2));
				i = in.readLine(line, 0, lineLen);//空行
				
				//begin to read file content				
				i = in.readLine(line, 0, lineLen);
				
				File f = new File((savePath==null? "noName" : savePath)+fileSuffix);
				FileOutputStream fp = new FileOutputStream(f);
				
				byte [] line1 = new byte[lineLen];
				
				i1 = i;
				while (i1 != -1 && i != -1) {
					i1 = in.readLine(line1, 0, lineLen);
					if ((i1==boundaryLength+2 || i1==boundaryLength+4) && (new String(line1, 0, i1).startsWith(boundary)))
					{
						fp.write(line,0,i-2);
						break;
					}
					else
					{
						fp.write(line,0,i);
					}
					i = in.readLine(line, 0, lineLen);
					if ((i==boundaryLength+2 || i==boundaryLength+4) && (new String(line, 0, i).startsWith(boundary)))
					{
						fp.write(line1,0,i1-2);
						break;
					}
					else
					{
						fp.write(line1,0,i1);
					}
				}
				fp.close();

			}
			else {
			// 普通表单输入元素
			// 获取输入元素名字
				int pos = newLine.indexOf("name=\"");
				String fieldName = newLine.substring(pos+6, newLine.length()-3);

				i = in.readLine(line, 0, lineLen);
				i = in.readLine(line, 0, lineLen);
				newLine = new String(line, 0, i);
				StringBuffer fieldValue = new StringBuffer(lineLen);
				while (i != -1 && !newLine.startsWith(boundary)) {
					// 最后一行包含换行字符
					// 因此我们必须检查当前行是否是最后一行
					i = in.readLine(line, 0, lineLen);
					System.out.println("check line:"+new String(line,0,i));
					if ((i==boundaryLength+2 || i==boundaryLength+4) && (new String(line, 0, i).startsWith(boundary)))
						fieldValue.append(newLine.substring(0, newLine.length()-2));
					else
						fieldValue.append(newLine);
					newLine = new String(line, 0, i);
				}
				fields.put(fieldName, fieldValue.toString());
			}
		}
		i = in.readLine(line, 0, lineLen);
	}

}

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?