servlet+JSP+mysql实现文件上传的方法
本文实例讲述了servlet+JSP+mysql实现文件上传的方法。分享给大家供大家参考,具体如下:
一、文件上传的基本操作:
1、表单属性enctype的设置
multipart/form-data和application/x-www-form-urlencoded的区别
FORM元素的enctype属性指定了表单数据向服务器提交时所采用的编码类型,默认的缺省值是“application/x-www-form-urlencoded”。
然而,在向服务器发送大量的文本、包含非ASCII字符的文本或二进制数据时这种编码方式效率很低。
在文件上载时,所使用的编码类型应当是“multipart/form-data”,它既可以发送文本数据,也支持二进制数据上载。
Browser端<form>表单的ENCTYPE属性值为multipart/form-data,它告诉我们传输的数据要用到多媒体传输协议,由于多媒体传输的都是大量的数据,所以规定上传文件必须是post方法,<input>的type属性必须是file。
实现过程:
packagecn.csdn.web.servlet;
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.sql.SQLException;
importjava.util.List;
importjava.util.UUID;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjavax.sql.DataSource;
importorg.apache.commons.dbutils.QueryRunner;
importorg.apache.commons.fileupload.FileItem;
importorg.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
importorg.apache.commons.fileupload.FileUploadException;
importorg.apache.commons.fileupload.disk.DiskFileItemFactory;
importorg.apache.commons.fileupload.servlet.ServletFileUpload;
importcn.csdn.web.c3p0.DBManager_c3p0;
publicclassUpload2ServletextendsHttpServlet{
/**
*
*/
privatestaticfinallongserialVersionUID=1L;
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doPost(request,response);
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
request.setCharacterEncoding("UTF-8");
try{
//实例化一个文件工厂
DiskFileItemFactoryfactory=newDiskFileItemFactory();
factory.setRepository(newFile("C:\\osp"));
StringparamName=null;
StringparamValue=null;
//配置上传组件ServletFileUpload
ServletFileUploadupload=newServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
upload.setFileSizeMax(1024*1024);
//从request得到所有上传域的列表
List<FileItem>list=upload.parseRequest(request);
for(FileItemitem:list){
//如果是上传域的文件域
if(item.isFormField()){
//表单普通输入项
paramName=item.getFieldName();//上传于的Name
//StringparamValue=item.getString();
//paramValue=newString(paramValue.getBytes("iso8859-1"),"UTF-8");
paramValue=item.getString("UTF-8");
System.out.println(paramName+"="+paramValue);
}else{
//上传文件处理
StringfileName=item.getName();
fileName=fileName.substring(fileName.lastIndexOf("\\")+1);//截取扩展名
System.out.println("name="+fileName);
if(!fileName.equals("")){
//fileName=refactorFileName(fileName);
InputStreamin=item.getInputStream();
Filefile=newFile("c:\\"+fileName);
FileOutputStreamos=newFileOutputStream(file);
byte[]buf=newbyte[1024];
intlen=0;
while((len=in.read(buf))>0){
os.write(buf,0,len);
}
os.flush();
os.close();
in.close();
item.delete();
request.setAttribute("message","文件上传成功");
try{
DataSourceds=DBManager_c3p0.getDataSource();
QueryRunnerrunner=newQueryRunner(ds);
Stringsql="insertintouser(name,file)values(?,?)";
Object[]params={paramValue,fileName};
runner.update(sql,params);
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
}
}catch(FileSizeLimitExceededExceptione1){
e1.printStackTrace();
request.setAttribute("message","文件尺寸太大");
}catch(FileUploadExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
request.setAttribute("message","文件上传失败");
}
request.getRequestDispatcher("/message.jsp").forward(request,response);
}
//publicStringrefactorFileName(StringfileName){
//returnUUID.randomUUID().toString()+"_"+fileName;
//}
}
二、上传文件要注意的有:
注意编码问题防止出现中文乱码上边列举出一种
其他的还有临时文件解决问题临时文件删除问题
解决没有指定文件名的问题
判断获取的文件名是否为空
保存路径问题
如表示url资源时应该用斜杠“/”
如表示硬盘路径时用斜杠“\\”
为保证服务器安全,上传的文件应禁止用户直接访问,通常保存在应用程序的WEB-INF目录下,或者不受WEB服务器管理的目录
希望本文所述对大家jsp程序设计有所帮助。