xmlhttp实现文件上传

xmlhttp实现文件上传

最近项目中要实现一个文件上传的功能,不用input[file]的方式,要通过文件路径直接上传本地文件,折腾了好几天,终于弄通了。

前台代码:

//发送字节流到服务器,stream是流,url是服务地址,taskId是任务号(后台需要)
function sendByteStreamToServer(stream,url,taskId){  
        if (window.XMLHttpRequest) {      
            xmlhttp = new XMLHttpRequest();       
            if (xmlhttp.overrideMimeType) {          
                xmlhttp.overrideMimeType("text/xml")      
            }  
        } 
        else if (window.ActiveXObject) {       
            var activexName = ["MSXML2.XMLHTTP","Microsoft.XMLHTTP"];      
            for (var i = 0; i < activexName.length; i++) {          
                try {              
                    xmlhttp = new ActiveXObject(activexName[i]);              
                    break;          
                } catch(e) {               
                    e.print()          
                }    
            } 
        } 
        xmlhttp.onreadystatechange = callback;  
        xmlhttp.open("post", url, false);  
        boundary="abcd"  
        xmlhttp.setRequestHeader("Content-Type", "binary");
        xmlhttp.setRequestHeader("Content-Length", stream.Size); 
        xmlhttp.setRequestHeader("Task-Id", taskId); 
        xmlhttp.send(stream); 
    }

//filepath是本地文件路径
function sendFileToServer(filePath,taskId){         
        var filepath=encodeURI(encodeURI(filePath));
        //后台服务地址
        var serverUrl = "http://localhost:8080/task/test_uploading_trans.do";
        //创建stream
        var adodbStream=new ActiveXObject("ADODB.Stream");

        adodbStream.Type = 1;//1=adTypeBinary
        adodbStream.mode = 3;//读写方式
        adodbStream.Open();
        adodbStream.Position = 0;
        //文件加载进流中
        adodbStream.LoadFromFile(filePath);
        //定位光标位置,从位置0开始
        adodbStream.Position = 0;
        sendByteStreamToServer(adodbStream,serverUrl,taskId);       
        //关闭流
        adodbStream.Close();
    }

sendFileToServer("d:\\tempFiles\\学历证书_1_1_591.doc",591);

后台代码:

@RequestMapping("/test_uploading_trans.do")
    @ResponseBody
    public CommonResp testUploadTarFile(HttpServletRequest request)
    {
        CommonResp resp = new CommonResp();
        try
        {

            InputStream in = request.getInputStream();
            byte[] bytes = Validater.input2byte(in);

            String taskId = request.getHeader("Task-Id");
            int taskIdInt = 0;
            if(taskId != null) 
            {
                taskIdInt = Integer.parseInt(taskId);
            }
            else
            {
                logger.error("taskId in request header is null");
                throw new XuefuException(CommonRespCode.ERROR_CODE, CommonRespCode.ERROR_MSG);
            }

            offlineTransService.testUploadTarFile(taskIdInt, bytes);

        }
        catch (XuefuException e)
        {
            resp.setRespCode(e.getCode());
            resp.setRespMsg(e.getMessage());
        }
        catch (Exception e)
        {
            logger.error(e.getMessage(), e);
            resp.setRespCode(CommonRespCode.ERROR_CODE);
            resp.setRespMsg(CommonRespCode.ERROR_MSG);
        }
        return resp;
    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值