用JSP分析multipart/form-data基于表单的文件上传

原创 2004年08月18日 17:21:00

<%
 int iTotalByte,iTotalRead,iReadByte;
 iTotalByte=request.getContentLength(); 
 iTotalRead=0;
 iReadByte=0;
 byte[] Buffer=new byte[iTotalByte];
 if(iTotalByte>0)
 {
  for(;iTotalRead<iTotalByte;iTotalRead+=iReadByte)
  {
   try
   {
iReadByte=request.getInputStream().read(Buffer,iTotalRead,iTotalByte-iTotalRead);
   }
   catch(Exception e)
   {
    e.printStackTrace();
   }
  }
  String strContentType=request.getContentType();
  //数据处理开始
  String strBuffer=new String(Buffer);
  %><!--<br>表单数据:<br>strBuffer<br>--><%
  String strBoundary="--"+strContentType.substring(strContentType.lastIndexOf("=")+1,strContentType.length());
  String strArray[]=strBuffer.split(strBoundary);

  String strSubString;
  int iBegin,iEnd;
  iBegin=0;iEnd=0;
  String strFieldName="";
  String strFieldValue="";
  String strFilePath="";
  String strFileName="";
  String strFileType="";
  boolean bTrue;
  bTrue=false;
  int iLocation=0;
  for(int iIndex=1;iIndex<strArray.length-1;iIndex++)
  {
   strSubString=strArray[iIndex];
   iBegin=strSubString.indexOf("name=/"",0);
   if(iBegin!=-1)
   {
    strFieldName="";strFieldValue="";
    strFilePath="";strFileName="";strFileType="";
    iEnd=strSubString.indexOf("/"",iBegin+6);
    strFieldName=strSubString.substring(iBegin+6,iEnd);
    iBegin=strSubString.indexOf("filename=/"",0);        if(iBegin!=-1)
    {
     bTrue=true;
    }
    iEnd=strSubString.indexOf("/r/n/r/n",0);
    if(bTrue==true)
    {
     //文件路径
     strFilePath=strSubString.substring(iBegin+10,strSubString.indexOf("/"",iBegin+10));strFileName=strFilePath.substring(strFilePath.lastIndexOf("//")+1);
     strFileType=strSubString.substring(strSubString.indexOf("Content-Type: ")+14,strSubString.indexOf("/r/n/r/n"));
     %><!--<br>文件类型:<br>strFileType<br>--><%
     //文件数据
     iBegin=strSubString.indexOf("/r/n/r/n",iBegin);
     strFieldValue=strSubString.substring(iBegin+4);
     strFieldValue=strFieldValue.substring(0,strFieldValue.lastIndexOf("/n")-1);
     %><!--<br>文件路径:<br>strFilePath<br>文件名称:<br>strFileName<br>--><%
     byte[] pFile=strFieldValue.getBytes();
     byte[] pFileExtend=new byte[pFile.length];
     iLocation=strBuffer.indexOf("filename=/"",iLocation);
     for(int kIndex=iLocation;kIndex<iTotalByte-2;kIndex++)
     {
      if(Buffer[kIndex]==13&&Buffer[kIndex+2]==13)
      {iLocation=kIndex+4;break;}
     }
     for(int nIndex=0;nIndex<pFile.length;nIndex++)
     {
      pFileExtend[nIndex]=Buffer[iLocation+nIndex];
     }
/*
//保存到Local Disk;
FileOutputStream pFileOutputStream=new FileOutputStream("F://Site_App//UploadFile//"+strFileName);
pFileOutputStream.write(pFileExtend);
pFileOutputStream.close();
*/
     session.putValue(strFieldName+"_FileType",strFileType);
     session.putValue(strFieldName+"_FilePath",strFilePath);
     session.putValue(strFieldName+"_FileName",strFileName);
     session.putValue(strFieldName,pFileExtend);
    }
    else
    {
     strFieldValue=strSubString.substring(iEnd+4);
     strFieldValue=strFieldValue.substring(0,strFieldValue.lastIndexOf("/n")-1);
session.putValue(strFieldName,strFieldValue);
    }
    bTrue=false;
   }
   %><!--<br>表单域名:<br>strFieldName<br>表单域值:<br>strFieldValue<br>--><%
  }
  //数据处理结束
 }
%>

这样(String)session.getValue("表单域名")返回表单域值,而(byte[])session.getValue("File上传控件域名")返回的字节数组就可以用new ByteArrayInputStream(byte[])调用updateBinaryStream来更新到数据库了

为什么上传文件的表单里面要加一个属性enctype=multipart/form-data?

首先知道enctype这个属性管理的是表单的MIME编码。共有三个值可选: 1、application/x-www-form-urlencoded 2、multipart/form-data 3、te...
  • qq_31780525
  • qq_31780525
  • 2016年09月24日 14:13
  • 882

在表单中加enctype="multipart/form-data" 怎么取得表单值

转载自:  http://blog.csdn.net/lian_zhihui1984/article/details/6822201 当提交表单里包含文件上传的时候,即Form的enctype...
  • shihengli2010
  • shihengli2010
  • 2016年06月07日 11:20
  • 2746

iOS之网络请求之AFN表单上传之form-data

表单上传呢一般是当要上传图片的时候用的网络请求方式。上传http post请求的表单格式是这样的Content-type: multipart/form-data, boundary=qwerdf ...
  • kws959844005
  • kws959844005
  • 2016年09月09日 15:12
  • 7032

为什么上传文件的表单需要设置enctype="multipart/form-data"

在学习PHP文件上传的过程中发现,HTML表单需要设置enctype="multipart/form-data"这个属性,虽然不这么设置的确无法上传,但这是为什么呢?...
  • mazhibinit
  • mazhibinit
  • 2015年11月05日 20:23
  • 11544

请问如何用nodejs通过post发送multipart/form-data类型的http请求?

请问如何用nodejs通过post发送multipart/form-data类型的http请求?  发布于 4 年前  作者 xuhaijinsky2008  24777 次浏览 ...
  • cdnight
  • cdnight
  • 2016年04月20日 17:48
  • 2378

post multipart/form-data 类型表单如何获取File外其他参数

要在Filter中解析原生的request,网上找的都不靠谱,我的应用中在controller层通过Spring完美解析,所以想到了直接使用Spring的原生支持来解决这个问题,终于找到了Common...
  • u012195214
  • u012195214
  • 2017年06月15日 23:14
  • 2841

简单解决 multipart/form-data 文件上传表单中 传递参数无法获取的办法! (解决办法:动态更改表单提交URL)

在jsp(其它动态web页面好像也存在)中,如果要上传文件,表单的enctype就必须设定为"multipart/form-data"了,这样就能够传递文件数据,却无法传递参数,如下的表单: ...
  • xuxiaocheng1
  • xuxiaocheng1
  • 2013年03月22日 22:33
  • 5200

httpClient 使用multipart/form-data 类型上传文件及表单

public static void post() throws ClientProtocolException, IOException {/**设置代理*/ // Proxy p=new Pro...
  • java_magicsun
  • java_magicsun
  • 2014年07月08日 18:14
  • 7679

Flex在线拍照并上传(兼容multipart/form-data)

关于Flex拍照的文章很多,Camera的用法基本上类似。   上传的一般做法是:得到ByteArray之后直接放在Request的体内容中传给服务器端,服务器打开请求流,直接读取byte[...
  • snail8384
  • snail8384
  • 2013年01月10日 12:19
  • 1325

Java Web 学习笔记之三: HttpURLConnection 模拟表单上传文件

利用HttpURLConnection发送post请求上传文件
  • johnson_moon
  • johnson_moon
  • 2016年07月10日 22:55
  • 3311
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用JSP分析multipart/form-data基于表单的文件上传
举报原因:
原因补充:

(最多只允许输入30个字)