简单实现java上传图⽚⽂件功能
总的说图⽚上传有两种⽅式,⼀种是把图⽚⽂件写到数据库中,另⼀种是存到服务器⽂件⽬录中。写到数据库中的图⽚⽂件需
要转换成⼆进制流的格式,占⽤数据库空间⽐较,适合少量图⽚的存储,⽐如说,系统中某些⼩图标,写到数据库中的优点是
⽐较安全,不容易被⽤户不⼩⼼删除。
如果是⼤量的图⽚的存储通常的做法是保存到服务器的某个⽂件夹中。⽽完成上传有很多⽅式,可以采⽤流的⽅式,可以采⽤
ftp的⽅式,这⾥采⽤fileupload⽅式。
随着系统规模的不同,对图⽚⽂件的处理⽅式也不尽相同。如果系统中图⽚的数量不是很⼤,直接把所有的图⽚存储到同⼀个
⽬录下即可。如果图⽚的积累⽐较多,可以根据物资分类对图⽚进⾏相应的分类储存,这样会节省⼀些在磁盘中查找⽂件的时
间。
图⽚上传到⽂件中,可以直接上传图⽚到⽬录中,也还可以将图⽚⽂件名、⽂件路径写⼊到数据库中,也可以在程序中动态的
创建⽂件路径。如果公司中要求图⽚要⽤专门的服务器存放,这时候把⽂件路径写活还是⽐较合适的。⼀般的如果⼀种物资
(物料)对应⼀张图⽚是⽐较容易处理的。如果对应多张图⽚,处理起来就需要配合循环使⽤。⼀⽅⾯,需要处理图⽚的动态显
⽰,另⼀⽅⾯要检查图⽚⽂件命名是否重复。另外再图⽚处理(上传、删除、修改)的时候需要配合事务。
下⾯重点介绍⼀下使⽤fileupload⽅式实现图⽚上传的最基本的实现。
1、前端使⽤file标签:
2、设置⽂件的enctype格式:multipart/form-data
关于enctype="multipart/form-data"的说明:
在jsp中使⽤了该格式,对应的Servlet就不能使⽤ameter()取得参数,要使⽤ServletFileUpload对象的
parRequest⽅法先把request对象中的数据解析,然后,使⽤解析出的元素的isFormField标志,配合getFieldName⽅法来
获取数据。
3、FileUploadServlet的实现:
;
;
ption;
or;
;
tException;
rvlet;
rvletRequest;
rvletRespon;
em;
leItemFactory;
tFileUpload;
nager;
nagerImpl;
ationException;
publicclassFileUploadServletextendsAbstractItemServlet{
privateFileuploadPath;
privateFiletempPath;
@Override
publicvoidinit()throwsServletException{
//在系统启动的时候,就开始初始化,在初始化时,检查上传图⽚的⽂件夹和存放临时⽂件的⽂件夹是否存在,如果不存在,就创建
//获取根⽬录对应的真实物理路径
uploadPath=newFile(getServletContext().getRealPath("upload"));
n("uploadPath====="+uploadPath);
//如果⽬录不存在
if(!()){
//创建⽬录
();
}
//临时⽬录
//FiletempFile=newFile(e())构造临时对象
tempPath=newFile(getServletContext().getRealPath("temp"));
if(!()){
();
}
//如果不显⽰调⽤⽗类⽅法,就不会有itemManager实例,因此会造成空指针
();
}
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponrespon)
throwsServletException,IOException{
doPost(request,respon);
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponrespon)
throwsServletException,IOException{
//从item_中拿取数据,因为上传页的编码格式跟⼀般的不同,使⽤的是enctype="multipart/form-data"
//form提交采⽤multipart/form-data,⽆法采⽤ameter()取得数据
//StringitemNo=ameter("itemNo");
//n("itemNo======"+itemNo);
/********************************使⽤FileUpload组件解析表单********************/
//DiskFileItemFactory:创建FileItem对象的⼯⼚,在这个⼯⼚类中可以配置内存缓冲区⼤⼩和存放临时⽂件的⽬录。
DiskFileItemFactoryfactory=newDiskFileItemFactory();
//maximumsizethatwillbestoredinmemory
eThreshold(4096);
//thelocationforsavingdatathatislargerthangetSizeThreshold()
ository(tempPath);
//ServletFileUpload:负责处理上传的⽂件数据,并将每部分的数据封装成⼀到FileItem对象中。
//在接收上传⽂件数据时,会将内容保存到内存缓存区中,如果⽂件内容超过了DiskFileItemFactory指定的缓冲区的⼤⼩,
//那么⽂件将被保存到磁盘上,存储为DiskFileItemFactory指定⽬录中的临时⽂件。
//等⽂件数据都接收完毕后,ServletUpload再从⽂件中将数据写⼊到上传⽂件⽬录下的⽂件中
ServletFileUploadupload=newServletFileUpload(factory);
//maximumsizebeforeaFileUploadExceptionwillbethrown
eMax(1000000*20);
/**********解析表单传递过来的数据,返回List集合数据-类型:FileItem***********/
try{
ListfileItems=equest(request);
StringitemNo="";
//Iteratoriter=or()取其迭代器
//t()检查序列中是否还有元素
for(Iteratoriter=or();t();){
//获得序列中的下⼀个元素
FileItemitem=(FileItem)();
//判断是⽂件还是⽂本信息
//是普通的表单输⼊域
if(Field()){
if("itemNo".equals(ldName())){
itemNo=ing();
}
}
//是否为input="type"输⼊域
if(!Field()){
//上传⽂件的名称和完整路径
StringfileName=e();
longsize=e();
//判断是否选择了⽂件
if((fileName==null||(""))&&size==0){
continue;
}
//截取字符串如:C:
fileName=ing(dexOf("")+1,());
//保存⽂件在服务器的物理磁盘中:第⼀个参数是:完整路径(不包括⽂件名)第⼆个参数是:⽂件名称
//(file);
//修改⽂件名和物料名⼀致,且强⾏修改了⽂件扩展名为gif
//(newFile(uploadPath,itemNo+".gif"));
//将⽂件保存到⽬录下,不修改⽂件名
(newFile(uploadPath,fileName));
//将图⽚⽂件名写⼊打数据库
ItemImage(itemNo,fileName);
}
}
direct(textPath()+"/rvlet/item/SearchItemServlet");
}catch(Exceptione){
tackTrace();
thrownewApplicationException("上传失败!");
}
}
}
该类继承了AbstractItemServlet:所有物料Servlet的抽象⽗类,负责实例化ItemManager
/**
*所有物料Servlet的抽象⽗类,负责实例化ItemManager
*@authorLiMin
*
*/
publicabstractclassAbstractItemServletextendsHttpServlet{
//虽然不是线程安全的,但是如果只读的话,是不会有错误的
protectedItemManageritemManager=null;
@Override
publicvoidinit()throwsServletException{
itemManager=newItemManagerImpl()
}
}
ItemManagerImpl是实现了ItemManager接⼝的⼦类。这种设计模式有⼀个问题,有待遇优化,但这⾥为了说明图⽚上
传,不多做⽆关的赘述。
总结:
关于init()初始化⽅法:
在Servlet初始化的时候,就动态创建⽬录,这⾥是把⼀个upload和临时⽂件tempPath创建到了tomcat的webapps下的项
⽬的跟⽬录中。
值得注意点是这⾥需要显⽰调⽤()⽅法(super不是⽗类对象的引⽤,但是负责⽗类的⽅法的调⽤),否则,可
能会造成该类的空指针。
上传⼤致分三步执⾏:使⽤FileUpload组件解析表单;解析表单传递过来的数据,返回List集合数据-类型:FileItem;最
后上传图⽚。
使⽤FileItem的isFormField()⽅法判断是普通⽂本还是⽂件;
使⽤(newFile(uploadPath,fileName))上传⽂件,第⼀个参数是:完整路径(不包括⽂件名)第⼆个参数
是:⽂件名称;
处理普通⽂本数据:
if("itemNo".equals(ldName())){
itemNo=ing();
}
上传是很多年⽐较成熟的技术,有很多已经封装好的,我们平时的项⽬中可以直接拿来⽤,但是了解⼀些基本的原理是必不可
少的。
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
本文发布于:2022-12-02 15:06:50,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/38515.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |