这篇文章主要为大家展示了“web中如何解决文件上传取不到真实路径问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“web中如何解决文件上传取不到真实路径问题”这篇文章吧。

创新互联公司长期为成百上千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为南湖企业提供专业的网站设计制作、网站设计,南湖网站改版等技术服务。拥有十余年丰富建站经验和众多成功案例,为您定制开发。
1、问题描述:
前一段时间要做一个excel数据导入到数据库的功能,当时用的是google chrome,没有用form表单,仅仅一个组件,上传excel时怎么也去不到文件路径,不论是从哪个驱动器上传,文件路径都是:c:\fakepath\文件名.xls。
2、解决方案
网上转悠了老半天,没找到一个完美的方案,最后经个同事指导:
利用一个js(插件)ajaxfileupload.js,源码放到最后面,先看具体代码:
jsp:
注意: file input的name属性必须的,后面要用.
js代码:(17行用到了input的name属性)
文件上传到: url : '<%=webapp%>' + '/FileUpload?path=file/share',这里用了servlet(该servlet对FileUpload路径进行拦截)
当然可以用action
$.ajaxFileUpload方法的成功回调方法有参数data及status,其中从data可以得知上传上去的文件的名字:文件名=data.img
function uploadfile() {
var upload_file = $("#subfile").val();
if (upload_file == null || upload_file == undefined || upload_file == "") {
Showbo.Msg.alert('系统提示:请选择要上传的文件!');
return false;
} else {
var file = upload_file.split('.');
var suffix = file[file.length - 1];
if (suffix != 'xls') {
Showbo.Msg.alert('文件格式必须是:xls');
return;
}
// $("#fileReal").val(upload_file);
$.ajaxFileUpload( {
url : '<%=webapp%>' + '/FileUpload?path=file/share',
secureuri : true,
fileElementId : 'subfile',
dataType : 'json',
success : function(data, status) {
$('#pic').attr( {
src : '<%=webapp%>/file/share/' + data
});
$('#newfile').val(data.img);
var filename = data.img;
importSubNum(filename);
//$('#pubbt').click();
/* $('#form1').submit();*/
/*Showbo.Msg.alert('文件上传成功!');*/
},
error : function(data, status, e) {
Showbo.Msg.alert('系统提示:' + e);
return false;
}
});
}
}当然靠上面的不够的,真正上传的幕后是(servlet):
package com.hg.sale.service.upload;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONObject;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.log4j.Logger;
/**
* 上传Service
*
* @author lvzhibo
*
*/
public class FileUpload extends HttpServlet {
static Logger logf=Logger.getLogger(FileUpload.class);
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
DiskFileItemFactory factory = new DiskFileItemFactory();
String param=request.getParameter("path");
String rename=request.getParameter("rename");
String name=request.getParameter("name");
String log=request.getParameter("log");
String path ="";
if(param!=null){
path = request.getRealPath(param);
}else{
path = request.getRealPath("/p_w_picpaths");
}
// 设置文件存储位置
factory.setRepository(new File(path));
// 设置大小,如果文件小于设置大小的话,放入内存中,如果大于的话则放入磁盘中
factory.setSizeThreshold(1024 * 1024);
ServletFileUpload upload = new ServletFileUpload(factory);
// 这里就是中文文件名处理的代码,其实只有一行,serheaderencoding就可以了
upload.setHeaderEncoding("gbk");
try {
List items = upload.parseRequest(request);
for (FileItem item : items) {
if (item.isFormField()) {
} else {
String fileName = item.getName();
if (fileName != null) {
int pos = fileName.lastIndexOf("\\");
if (pos + 1 < fileName.length()) {
fileName = fileName.substring(pos + 1);
}
}
//author xuzijin 6.19 自定义图片名称
File fpath=new File(path);
if(!fpath.exists()){
fpath.mkdir();
}
if(name!=null&&rename!=null){
String[] str=fileName.split("\\.");
int rnm=Integer.parseInt(rename);
if(rnm<=4){
fileName=name+"_main_"+rename+"."+str[1];
}else{
int rn=rnm-4;
fileName=name+"_icon_"+rn+"."+str[1];
}
}
if(name==null&&rename!=null){
String[] str=fileName.split("\\.");
int rnm=Integer.parseInt(rename);
String imgName="";
switch(rnm){
case 2001:
imgName="attr_1";
break;
case 2002:
imgName="attr_2";
break;
case 2003:
imgName="attr_3";
break;
case 2004:
imgName="attr_4";
break;
case 2005:
imgName="attr_5";
break;
case 2006:
imgName="attr_6";
break;
case 2007:
imgName="attr_7";
break;
case 2008:
imgName="attr_8";
break;
}
fileName=imgName+"."+str[1];
}
if(rename==null&&name==null&&log==null){
fileName=getTime()+getExtensionName(fileName);
}
/*if(rename==null&&name==null&&log.equals("time")){
fileName= getFileName(fileName)+getTime()+getExtensionName(fileName);
}*/
response.setContentType("text/html");
response.setCharacterEncoding("gbk");
item.write(new File(path, fileName));
PrintWriter out = response.getWriter();
JSONObject obj=new JSONObject();
obj.put("img", fileName);
out.println(obj.toString());
logf.info("xml="+(obj.toString()));
}
}
} catch (FileUploadException e) {
response.getWriter().print(e.toString());
} catch (Exception e) {
e.printStackTrace();
response.getWriter().print(e.toString());
}
}
public String getExtensionName(String filename) {
if ((filename != null) && (filename.length() > 0)) {
int dot = filename.lastIndexOf('.');
if ((dot >-1) && (dot < (filename.length() - 1))) {
return filename.substring(dot);
}
}
return filename;
}
public String getTime(){
SimpleDateFormat formatter = new SimpleDateFormat ("yyyyMMddhh34mmss");
Date curDate = new Date(System.currentTimeMillis());//获取当前时间
String str = formatter.format(curDate);
return str;
}
public String getFileName(String filename) {
if ((filename != null) && (filename.length() > 0)) {
int dot = filename.lastIndexOf('.');
if ((dot >-1) && (dot < (filename.length() - 1))) {
return filename.substring(0,dot-1);
}
}
return filename;
}
} ajaxfileupload.js
// JavaScript Document
jQuery.extend({
createUploadIframe: function(id, uri)
{
//create frame
var frameId = 'jUploadFrame' + id;
if(window.ActiveXObject) {
var io = document.createElement('以上是“web中如何解决文件上传取不到真实路径问题”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!