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;
}