java 上傳文件代碼,支持中文文件名和中文文件內容,可以同時提交多個參數
提交的表單代碼:
































































文件上傳的類:暫時只支持單個文件上傳
package web.QiXiangTong;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.util.HashMap;
//import com.khan.net.*;
/*
version 1.0
修正了傳遞二進制文件不正常的問題, 因為我將流轉成了字符串的方式解析, 導致二進制文件的不可見字符轉碼失敗
解決, 全部采用byte解析
暫時還是只能上傳單個文件
支持傳遞文件的同時, 參數url參數
*/
public class uploadFile {
public static final int MAX_SIZE = 1024 * 1024*100;
public static final String FILE_DIR = "d:/temp/";
private int file_Size=0;
private String file_Path = "";
private HashMap hm = new HashMap();
public String upLoad(HttpServletRequest req) {
String tmpString ="";
String result = "";
DataInputStream dis = null;
try {
dis = new DataInputStream(req.getInputStream());
String content = req.getContentType();
if (content != null && content.indexOf("multipart/form-data") != -1) {
int reqSize = req.getContentLength();
byte[] data = new byte[reqSize];
int bytesRead = 0;
int totalBytesRead = 0;
int sizeCheck = 0;
while (totalBytesRead < reqSize) {
// check for maximum file size violation
sizeCheck = totalBytesRead + dis.available();
if (sizeCheck > MAX_SIZE)
result = "文件太大不能上傳...";
bytesRead = dis.read(data, totalBytesRead, reqSize);
totalBytesRead += bytesRead;
}
tmpString = new String(data);
hm = parseAnotherParam(tmpString);
//System.out.println("src datatmp |"+new String(data)+"|");
int postion = arrayIndexOf(data, "\r\n".getBytes());
byte[] split_arr = new byte[postion];
System.arraycopy(data, 0, split_arr, 0, postion);
//System.out.println("split |"+new String(split_arr)+"|");
postion = arrayIndexOf(data, "filename=\"".getBytes());
byte[] dataTmp = new byte[data.length - postion];
System.arraycopy(data, postion, dataTmp, 0, dataTmp.length);
data = null;
data = dataTmp.clone();
String filePath =null;
postion = arrayIndexOf(data, "Content-Type:".getBytes())-2;
dataTmp = null;
dataTmp = new byte[postion];
System.arraycopy(data, 0, dataTmp, 0, dataTmp.length);
filePath = new String(dataTmp);
if (filePath==null && filePath.equals("")) return "";
//System.out.println("filename |"+filePath+"|");
// 分離contentType 并賦值
postion = arrayIndexOf(data, "Content-Type:".getBytes());
dataTmp = null;
dataTmp = new byte[data.length - postion];
System.arraycopy(data, postion, dataTmp, 0, dataTmp.length);
data = null;
data = dataTmp.clone();
//System.out.println("src adatatmp |"+new String(data)+"|");
postion = arrayIndexOf(data, "\n".getBytes()) + 1;
dataTmp = null;
dataTmp = new byte[data.length - postion];
System.arraycopy(data, postion, dataTmp, 0, dataTmp.length);
data = null;
data = dataTmp.clone();
//System.out.println("datatmp |"+new String(data)+"|");
// 分離文件信息 獲得最終想要的字節
postion = arrayIndexOf(data, split_arr);
split_arr = null;
dataTmp = null;
dataTmp = new byte[postion - 2];
System.arraycopy(data, 2, dataTmp, 0, dataTmp.length);
data = null;
data = dataTmp.clone();
//System.out.println("datatmp |"+new String(data)+"|");
postion = arrayLastIndexOf(data, "\n".getBytes())-1;
dataTmp = null;
dataTmp = new byte[postion];
//System.out.println("postion:"+postion + " datalength:"+ data.length +" tmplength:" + dataTmp.length);
System.arraycopy(data, 0, dataTmp, 0, dataTmp.length);
data = null;
//System.out.println("data |"+new String(dataTmp)+"|");
String file_path = getFileName(filePath);
//System.out.println("file_path:"+file_path);
if(null != file_path) {
if (writeFile(dataTmp, FILE_DIR + file_path)) {
this.file_Size = dataTmp.length;
this.file_Path = FILE_DIR + file_path;
result = "文件上傳完畢";
} else {
result = "文件上傳失敗";
}
}else{
result = "文件名為空";
}
dataTmp = null;
} else {
result = "content 必須為 multipart/form-data";
}
} catch (UnsupportedEncodingException ex4) {
result = "UnsupportedEncodingException錯誤";
} catch (NullPointerException e) {
result = "NullPointerException錯誤";
} catch (IOException ex1) {
result = "IOException 錯誤 ";
}catch (Exception ex1) {
result = "Exception 錯誤 ";
}
return result;
}
public String getFilePath(){
return this.file_Path;
}
public int getFileSize(){
return this.file_Size;
}
public boolean writeFile(byte[] data, String path) {
File f = null;
FileOutputStream fos = null;
try {
f = new File(path);
f.createNewFile();
fos = new FileOutputStream(f);
fos.write(data, 0, data.length);
} catch (FileNotFoundException e) {
return false;
} catch (IOException e) {
return false;
} finally {
try {
fos.close();
} catch (IOException e) {
return false;
}
}
return true;
}
public String getFileName(String arg) {
String path = "";
if(arg.equals("\"\"")) {
return null;
}
if (arg.indexOf("\"") > -1)
path = arg.substring(arg.indexOf("\"") + 1, arg.lastIndexOf("\""));
else
path = arg;
//System.out.println("file_path:"+arg);
path = path.substring(path.lastIndexOf("\\") + 1);
return path;
}
//判斷兩個byte數組的值是否相等
private boolean arrayEquals(byte[] src, byte[] value){
if(src == null || value == null)
return false;
if(src.length != value.length)
return false;
for(int i=0; i<src.length; i++) {
if(src[i] != value[i])
return false;
}
return true;
}
//找出value數組在src中的位置, 從前往后
private int arrayIndexOf(byte[] src, byte[] value){
if(src == null || value == null)
return -1;
if(src.length < value.length)
return -1;
int postion = -1;
for(int i=0; i<src.length - value.length; i++) {
postion = i;
byte[] tmp = new byte[value.length];
System.arraycopy(src, i, tmp, 0, tmp.length);
if(arrayEquals(tmp, value)) {
tmp = null;
return postion;
}else{
postion = -1;
tmp = null;
}
}
return postion;
}
//找出value數組在src中的位置
private int arrayLastIndexOf(byte[] src, byte[] value){
if(src == null || value == null)
return -1;
if(src.length < value.length)
return -1;
int postion = -1;
for(int i=src.length - value.length ; i >-1; i--) {
postion = i;
byte[] tmp = new byte[value.length];
System.arraycopy(src, i, tmp, 0, tmp.length);
//System.out.println(i);
//Common.PrintDataHex(tmp, " ");
//Common.PrintDataHex(value, " ");
if(arrayEquals(tmp, value)) {
tmp = null;
return postion;
}else{
postion = -1;
tmp = null;
}
}
//System.out.println("debug");
return postion;
}
public HashMap parseAnotherParam(String str){
HashMap<String, String> hm= new HashMap<String, String>();
String key="";
String value="";
int startindex = 0;
int endindex = 0;
startindex = str.indexOf("Content-Disposition: form-data; name=\"")
+ "Content-Disposition: form-data; name=\"".length();
endindex = str.indexOf("\"\r\n\r\n");
while ( startindex >-1 && endindex > -1 ){
key = str.substring(startindex, endindex);
if(!str.substring(endindex , endindex + 5).equals("\"\r\n\r\n") ){//去掉沒有value的元素
str = str.substring(endindex);
startindex = str.indexOf("Content-Disposition: form-data; name=\"")
+ "Content-Disposition: form-data; name=\"".length();
endindex = str.indexOf("\"\r\n\r\n");
continue;
}
if( key.indexOf("\";") > -1){//去掉上傳文件的參數以及編碼
str = str.substring(str.indexOf("\";") + 2);
startindex = str.indexOf("Content-Disposition: form-data; name=\"")
+ "Content-Disposition: form-data; name=\"".length();
endindex = str.indexOf("\"\r\n\r\n");
continue;
} else
str = str.substring(endindex + 5);
value = str.substring(0, str.indexOf("\r\n"));
str = str.substring(str.indexOf("\r\n") + 2);
//System.out.println("key:"+key+" value:"+value);
hm.put(key,value);
startindex = str.indexOf("Content-Disposition: form-data; name=\"")
+ "Content-Disposition: form-data; name=\"".length();
endindex = str.indexOf("\"\r\n\r\n");
}
return hm;
}
public String getParameter(String param){
//System.out.println(hm.toString());
return (String)hm.get(param);
}
}
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.util.HashMap;
//import com.khan.net.*;
/*
version 1.0
修正了傳遞二進制文件不正常的問題, 因為我將流轉成了字符串的方式解析, 導致二進制文件的不可見字符轉碼失敗
解決, 全部采用byte解析
暫時還是只能上傳單個文件
支持傳遞文件的同時, 參數url參數
*/
public class uploadFile {
public static final int MAX_SIZE = 1024 * 1024*100;
public static final String FILE_DIR = "d:/temp/";
private int file_Size=0;
private String file_Path = "";
private HashMap hm = new HashMap();
public String upLoad(HttpServletRequest req) {
String tmpString ="";
String result = "";
DataInputStream dis = null;
try {
dis = new DataInputStream(req.getInputStream());
String content = req.getContentType();
if (content != null && content.indexOf("multipart/form-data") != -1) {
int reqSize = req.getContentLength();
byte[] data = new byte[reqSize];
int bytesRead = 0;
int totalBytesRead = 0;
int sizeCheck = 0;
while (totalBytesRead < reqSize) {
// check for maximum file size violation
sizeCheck = totalBytesRead + dis.available();
if (sizeCheck > MAX_SIZE)
result = "文件太大不能上傳...";
bytesRead = dis.read(data, totalBytesRead, reqSize);
totalBytesRead += bytesRead;
}
tmpString = new String(data);
hm = parseAnotherParam(tmpString);
//System.out.println("src datatmp |"+new String(data)+"|");
int postion = arrayIndexOf(data, "\r\n".getBytes());
byte[] split_arr = new byte[postion];
System.arraycopy(data, 0, split_arr, 0, postion);
//System.out.println("split |"+new String(split_arr)+"|");
postion = arrayIndexOf(data, "filename=\"".getBytes());
byte[] dataTmp = new byte[data.length - postion];
System.arraycopy(data, postion, dataTmp, 0, dataTmp.length);
data = null;
data = dataTmp.clone();
String filePath =null;
postion = arrayIndexOf(data, "Content-Type:".getBytes())-2;
dataTmp = null;
dataTmp = new byte[postion];
System.arraycopy(data, 0, dataTmp, 0, dataTmp.length);
filePath = new String(dataTmp);
if (filePath==null && filePath.equals("")) return "";
//System.out.println("filename |"+filePath+"|");
// 分離contentType 并賦值
postion = arrayIndexOf(data, "Content-Type:".getBytes());
dataTmp = null;
dataTmp = new byte[data.length - postion];
System.arraycopy(data, postion, dataTmp, 0, dataTmp.length);
data = null;
data = dataTmp.clone();
//System.out.println("src adatatmp |"+new String(data)+"|");
postion = arrayIndexOf(data, "\n".getBytes()) + 1;
dataTmp = null;
dataTmp = new byte[data.length - postion];
System.arraycopy(data, postion, dataTmp, 0, dataTmp.length);
data = null;
data = dataTmp.clone();
//System.out.println("datatmp |"+new String(data)+"|");
// 分離文件信息 獲得最終想要的字節
postion = arrayIndexOf(data, split_arr);
split_arr = null;
dataTmp = null;
dataTmp = new byte[postion - 2];
System.arraycopy(data, 2, dataTmp, 0, dataTmp.length);
data = null;
data = dataTmp.clone();
//System.out.println("datatmp |"+new String(data)+"|");
postion = arrayLastIndexOf(data, "\n".getBytes())-1;
dataTmp = null;
dataTmp = new byte[postion];
//System.out.println("postion:"+postion + " datalength:"+ data.length +" tmplength:" + dataTmp.length);
System.arraycopy(data, 0, dataTmp, 0, dataTmp.length);
data = null;
//System.out.println("data |"+new String(dataTmp)+"|");
String file_path = getFileName(filePath);
//System.out.println("file_path:"+file_path);
if(null != file_path) {
if (writeFile(dataTmp, FILE_DIR + file_path)) {
this.file_Size = dataTmp.length;
this.file_Path = FILE_DIR + file_path;
result = "文件上傳完畢";
} else {
result = "文件上傳失敗";
}
}else{
result = "文件名為空";
}
dataTmp = null;
} else {
result = "content 必須為 multipart/form-data";
}
} catch (UnsupportedEncodingException ex4) {
result = "UnsupportedEncodingException錯誤";
} catch (NullPointerException e) {
result = "NullPointerException錯誤";
} catch (IOException ex1) {
result = "IOException 錯誤 ";
}catch (Exception ex1) {
result = "Exception 錯誤 ";
}
return result;
}
public String getFilePath(){
return this.file_Path;
}
public int getFileSize(){
return this.file_Size;
}
public boolean writeFile(byte[] data, String path) {
File f = null;
FileOutputStream fos = null;
try {
f = new File(path);
f.createNewFile();
fos = new FileOutputStream(f);
fos.write(data, 0, data.length);
} catch (FileNotFoundException e) {
return false;
} catch (IOException e) {
return false;
} finally {
try {
fos.close();
} catch (IOException e) {
return false;
}
}
return true;
}
public String getFileName(String arg) {
String path = "";
if(arg.equals("\"\"")) {
return null;
}
if (arg.indexOf("\"") > -1)
path = arg.substring(arg.indexOf("\"") + 1, arg.lastIndexOf("\""));
else
path = arg;
//System.out.println("file_path:"+arg);
path = path.substring(path.lastIndexOf("\\") + 1);
return path;
}
//判斷兩個byte數組的值是否相等
private boolean arrayEquals(byte[] src, byte[] value){
if(src == null || value == null)
return false;
if(src.length != value.length)
return false;
for(int i=0; i<src.length; i++) {
if(src[i] != value[i])
return false;
}
return true;
}
//找出value數組在src中的位置, 從前往后
private int arrayIndexOf(byte[] src, byte[] value){
if(src == null || value == null)
return -1;
if(src.length < value.length)
return -1;
int postion = -1;
for(int i=0; i<src.length - value.length; i++) {
postion = i;
byte[] tmp = new byte[value.length];
System.arraycopy(src, i, tmp, 0, tmp.length);
if(arrayEquals(tmp, value)) {
tmp = null;
return postion;
}else{
postion = -1;
tmp = null;
}
}
return postion;
}
//找出value數組在src中的位置
private int arrayLastIndexOf(byte[] src, byte[] value){
if(src == null || value == null)
return -1;
if(src.length < value.length)
return -1;
int postion = -1;
for(int i=src.length - value.length ; i >-1; i--) {
postion = i;
byte[] tmp = new byte[value.length];
System.arraycopy(src, i, tmp, 0, tmp.length);
//System.out.println(i);
//Common.PrintDataHex(tmp, " ");
//Common.PrintDataHex(value, " ");
if(arrayEquals(tmp, value)) {
tmp = null;
return postion;
}else{
postion = -1;
tmp = null;
}
}
//System.out.println("debug");
return postion;
}
public HashMap parseAnotherParam(String str){
HashMap<String, String> hm= new HashMap<String, String>();
String key="";
String value="";
int startindex = 0;
int endindex = 0;
startindex = str.indexOf("Content-Disposition: form-data; name=\"")
+ "Content-Disposition: form-data; name=\"".length();
endindex = str.indexOf("\"\r\n\r\n");
while ( startindex >-1 && endindex > -1 ){
key = str.substring(startindex, endindex);
if(!str.substring(endindex , endindex + 5).equals("\"\r\n\r\n") ){//去掉沒有value的元素
str = str.substring(endindex);
startindex = str.indexOf("Content-Disposition: form-data; name=\"")
+ "Content-Disposition: form-data; name=\"".length();
endindex = str.indexOf("\"\r\n\r\n");
continue;
}
if( key.indexOf("\";") > -1){//去掉上傳文件的參數以及編碼
str = str.substring(str.indexOf("\";") + 2);
startindex = str.indexOf("Content-Disposition: form-data; name=\"")
+ "Content-Disposition: form-data; name=\"".length();
endindex = str.indexOf("\"\r\n\r\n");
continue;
} else
str = str.substring(endindex + 5);
value = str.substring(0, str.indexOf("\r\n"));
str = str.substring(str.indexOf("\r\n") + 2);
//System.out.println("key:"+key+" value:"+value);
hm.put(key,value);
startindex = str.indexOf("Content-Disposition: form-data; name=\"")
+ "Content-Disposition: form-data; name=\"".length();
endindex = str.indexOf("\"\r\n\r\n");
}
return hm;
}
public String getParameter(String param){
//System.out.println(hm.toString());
return (String)hm.get(param);
}
}
調用方式如下:
com.khan.web.uploadFile upload = new com.khan.web.uploadFile();
//上傳文件
out.print("<p><a>文件上傳狀態:" + upload.upLoad(request) + "</a></p>");
//取得上傳文件的大小
strs[0][5] = String.valueOf(upload.getFileSize()) ;
//取得跟隨文件一起提交的表單中其他參數
String filepath = upload.getParameter("filepath");
String file_type = upload.getParameter("file_type");
String songstyle = upload.getParameter("songstyle");
2006-8-17 15:38 修正文件上傳后會附加一段亂碼的bug
計劃下一步增加同時上傳多個文件的功能
posted on 2006-08-11 15:49 Khan 閱讀(11796) 評論(7) 編輯 收藏 引用 所屬分類: 跨平臺開發 、Java