如果你要用<input type=file>来上传文件的话,
注意在一个表单中如果enctype="multipart/form-data"属性的话,
是不能接收除type=file外的其他表单元素类型的。
即如果你把<input type=file>和<input type=text">放在同一表单中,
而该表单的enctype="multipart/form-data"的话,
request.getParamter取text的值会为空,
这个问题的最简单的解决方法是将<input type=file>单独放一个表单,
上传文件时只提交该表单即可。
所以在属性为multipart/form-data的form中别放type为text的input项目,否则将得不到想要的数据值。
- import java.io.DataInputStream;
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import javax.servlet.http.HttpServletRequest;
- import java.io.*;
- import java.util.HashMap;
- 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;
- String split_Str = "";
- 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;
- }
- String dataString = null;
- //dataString = new String(data, "ISO-8859-1");
- dataString = new String(data);
- tmpString = new String(data);
- hm = parseAnotherParam(tmpString);
- //取出字段分割符
- split_Str = dataString.substring(0, dataString.indexOf("/r/n"));
- // 分离filepath 并赋值
- dataString = dataString.substring(dataString.indexOf("filename=/""));
- String filePath = dataString.substring(0, dataString.indexOf("Content-Type:"));
- if (filePath==null && filePath.equals("")) return "";
- //System.out.println(filePath);
- dataString = new String(dataString.getBytes(),"ISO-8859-1");
- // 分离contentType 并赋值
- dataString = dataString.substring(dataString.indexOf("Content-Type:") + 1);
- dataString = dataString.substring(dataString.indexOf("/n") + 1);
- // 分离文件信息 获得最终想要的字节
- //System.out.print("|"+dataString+"|");
- dataString = dataString.substring(2, dataString.indexOf(split_Str));
- //System.out.println("|"+dataString+"|");
- dataString = dataString.substring(0, dataString.lastIndexOf("/n") - 1);
- //System.out.print("|"+dataString+"|");
- if (writeFile(dataString.getBytes("ISO-8859-1"), FILE_DIR + getFileName(filePath))) {
- this.file_Size = dataString.getBytes("ISO-8859-1").length;
- this.file_Path = FILE_DIR + getFileName(filePath);
- result = "文件上传完毕";
- } else {
- result = "文件上传失败";
- }
- } else {
- result = "content 必须为 multipart/form-data";
- }
- } catch (UnsupportedEncodingException ex4) {
- result = "getBytes 失败 UnsupportedEncodingException错误";
- } catch (NullPointerException e) {
- result = "getBytes 失败 NullPointerException错误";
- } catch (IOException ex1) {
- result = "IOException 错误 ";
- }
- 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.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;
- }
- public HashMap parseAnotherParam(String str){
- HashMap hm= new HashMap();
- 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);
- }
- }