日期:2014-05-16  浏览次数:20350 次

不用外部JAR包,自己实现JSP文件上传!

奋斗看书上(JSP应用与开发技术)使用JSP文件上传,写了个真无语,压根就有很多问题,上传500KB的文件传过去后只剩350KB,而且编码必须是GBK、GB2312,否则传过去的文件都数据截取不正确。

琢磨了许久,发现问题出在

int startPos = ((file.substring(0,pos)).getBytes()).length;
//取得文件数据的结束的位置
int endPos =((file.substring(0,boundaryLocation)).getBytes()).length;


这里,问题就是根据字符串获取的字节数,然后从字节数组里截取根本就不正确。而后自己实现了个,不用字符串字节,而是自己以字节找字节。如下:

UploadTelRecord.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="java.io.DataInputStream"%>
<%@page import="java.io.FileOutputStream"%>
<%@page import="java.io.File"%>
<%@page import="java.net.URLEncoder" %>
<!-- 上传通话录音文件 -->
<%!
   //在字节数组里查找某个字节数组,找到返回>=0,未找到返回-1
   private int byteIndexOf(byte[] data,byte[] search,int start)
    {
        int index=-1;
        int len=search.length;
        for(int i=start,j=0;i<data.length;i++)
        {        
        
            int temp=i;
            j=0;
            while(data[temp]==search[j])
            {
                System.out.println((j+1)+",值:"+data[temp]+","+search[j]);

                //计数
               j++;
               temp++;
               if(j==len)
               {
                  index=i;
                  return index;
               }
                
            }
            
                    
        }
        return index;
    }
%>
<%
String getAction=request.getParameter("action");
if(getAction!=null&&(getAction.equals("upload"))) //上传文件
{
    //定义上传的最大文件字节数1M
    int MAX_SIZE=1024000;
    String rootPath;
    DataInputStream in=null;
    FileOutputStream fileOut=null;
    
    String remoteAddr=request.getRemoteAddr();
    String serverName=request.getServerName();
    String realPath=request.getRealPath("/");
    realPath=realPath.substring(0,realPath.lastIndexOf("\\"));
    //设置保存文件的目录
    rootPath=realPath+ "\\upload\\telRecord\\";
    //取得客户端上传的数据类型
    String contentType=request.getContentType();
    try{
        if(contentType.indexOf("multipart/form-data")>=0){
            in=new DataInputStream(request.getInputStream());