文件的上传与下载的核心在于后台对于数据流的接收与输出,下面我将分开讲讲文件的上传与下载,在总结的过程中忽略前端JSP如何实现。
1.文件的上传:
当我早期学习Structs框架的时候,对于文件的上传,在Action中对应三个属性即:file,uploadContentType,uploadFileName,来接收前端数据。file接收文件数据流,uploadContentType接收文件类型,uploadFileName接收文件名。
接下来的过程就是
FileInputStream input =new FileInputStream(this.file);将文件数据流转化为输入流
File file=new File(realpath+uploadFileName); 这个地方可以对uploadFileName做一个处理,目的在于无论上传到服务器端的文件名是不一样的,即使是同一个文件,这个做的好处在于防止同一文件被多次上传后因为名字是一样的会出现异常
if(file.getParentFile()==null){
file.getParentFile().mkdirs(); 这个部分是为了生成对应的文件夹
}
FileOutputStream out=new FileOutputStream(file.toString());创建文件的输出流()
byte[] b=new byte[1024]; 缓存数据
int length=0;
while((length=input.read(b))>0){
out.write(b,0,length);
}
out.flush();
out.close
以上是早期涉及文件上传的时候我常常使用的方式,当然里面依然省略了一下细节(文件信息存入到数据库)。这种方式好不好,很方便,只要在使用Structs框架时候导入Commons-fileupload.jar这个包,就可以这样使用了。
现在讲讲我目前使用的文件上传的方式其核心为:ServletFileUpload为了便于叙述我们姑且称它为文件上传器 。它和我早期使用的文件上传是一个什么样的关系呢?!
首先,InputStream input;
FileOutputStream ou;
ServletFileUpload uploader=new ServletFileUpload(new DiskFileItemFactory());实例化这里的DiskFileItemFactory可以设置缓存硬盘的大小等一些参数,一般情况下默认即可
List<FileItem> items=uploader.parseRequest(ServletActionContext.getRequest());无论前端表单是什么样的数据标签类型,一律转化为FileItem类型
for(FileItem item:items){
if(item.getFileName!=null&&item.getInputStream){
input=item.getInputStream();
filename=item.getFileName();
................... }
} 通过这种遍历判断是不是你要找的文件数据流,然后对其进行处理与早期一致这里就不详细写了。
那么它们俩之间是一个什么样的关系呢,我们知道早期我使用文件上传的方法中需要导入一个Commons-upload.jar这样一个包,我们打开这个包后发现其实它对ServletFileUpload进行了封装调用,为的用起来更加方便。所以选择用哪一种都是可以的,但是个人偏向于现在所使用的,这里只是简单对其做了介绍,当然它还可以监测文件的上传进度这里就不详细说明了。
2.文件的下载
刚开始接触文件下载的朋友,可能会问一个问题不论文件的下载,还是图片的显示,下载也好。我们都是可以通过src属性设置文件的路径就可以实现下载,比如通过<a href="文件路径">文件下载</a>这样是没问题的,但是有一个前提就是jsp页面不能放在web-inf下面。因为在web-inf下面的文件,用户是没办法直接访问到的,只能通过后台的跳转才可以访问。
所以我们一般是这样实现的:当点击文件下载的超链接的时候,通过js跳转到后台,在后台将下载的文件转化为数据输出流输出到前端。
同样前端代码忽略,讲讲后台代码如何实现;
FileInputStream input;
OutputStream out=ServletActionContext.getResponse().getOutputStream();
File file=new File(storepath+filename);
input=new FileinputStream(file);
byte[] buffer=new byte[1024];
int lengt=0;
while((length=input.read(buffer))>0){
out.write(b,0,length);
}
out.flush();
out.close();