JavaEE实现前后台交互的文件上传与下载

网友投稿 252 2023-07-26


JavaEE实现前后台交互的文件上传与下载

首先为大家介绍相关的技术:

service方法中的两个重要参数。

ServletRequest – 用接收用户的请求,它的作用是:

可获取请求头信息。

可设置请请求的字符编码。

可获得用户传递的参数。Post或get。

可获取远程(即访问者)的IP地址。

可获取输入流,如用户上传文件、相片等。

它的一个子接口:javax.servlet.http.HttpServletRequest

ServletResponse – 用于向用户返回数据。

设置响应类型- contentType

设置编码-setCharacterEncoding

获取输出流。

它的一个子接口:javax.servlet.http.HttpServletResponse

文件下载技术:

文件下载技术相当于文件上传技术相对而言比较简单。我们以下载图片为例:

图片都是先浏览再下载

1.前端代码:

查找文件夹下面的所有图片

前台只需要一句话就可以搞定了。直接通过web.xml查找后台的程序

2.后台显示代码:

public class ShowImg extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doPost(request, response);//为了防止异常,将doGet和doPost连接在一起

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

request.setCharacterEncoding("utf-8");

response.setContentType("text/html;charset=utf-8");

PrintWriter out = response.getWriter();

ServletContext context =getServletContext();String path=context.getRealPath("/imgs");//找到该文件夹的绝对路径File file =new File(path);

// 找到文件夹之后,列出所有图片供用户浏览

String files[] =file.list();

for(String fn:files){

String img="";

// out.print("下载图片");String str="下载图片";//提供下载的超链接,传参---传文件名给用户链接内容下面写out.print(str);out.print(img+"
");}}

3.文件的具体下载

首先必须设置相应的协议。下载协议就需要设置相应的下载头

response.setContentType("application/force-download");//设置相应头

下载的时候需要显示当前图片的文件名,需要从前台获取,并且从下载获得之后写到前台去

OutputStream out=response.getOutputStream();//获得输出流

String name=request.getParameter("name");//从客服端传过来的参数名

int num=name.lastIndexOf("/");

String aa=name.substring(num+1);

aa=URLEncoder.encode(aa, "UTF-8");//若是中文需要重新编码

//System.out.println(aa);

response.setHeader("Content-Disposition","attachment;filename='"+aa+"'");//获取从那边传过来的文件名,以便于存储的时候为下载用户名

进行具体的下载

String filename=this.getServletContext().getRealPath(name);//获得绝对路径,传文件名过来,同时传了可以获得的绝对路径就可以进行读可写了

InputStream in=new FileInputStream(filename);

byte[] b=new byte[1024];

int len=0;

while((len=in.read(b))!=-1){

out.write(b, 0, len);

}

效果图:

点击之后的效果图:

传文件名不一样

文件上传技术

文件上传要是自己去写会很麻烦,所以我们可以用别人的包,下载链接点击打开链接

表单:

客户端发送HTTP必须使用multipart/form-data数据类型,表示复合数据类型。

即:

在表单中使用html标签。

需要的包:

Commons-fileupload.jar,核心上传文件工具都在这个包中。

commons-io.jar – 上传文件所需要的包

详解:

DiskFileItemFactory-创建监时文件目录,指是缓存区大小

ServletFileUpload用于解析HttpServletRequest。返回一组文件对象。

FileItem – 表示用户上传的每一个文件对像。

主要流程:

File f  = new File("F:/ex/temp");//指定临时文件存放位置

DiskFileItemFactory ff =new DiskFileItemFactory(1024*1024*5, f);//临时文件的大小和存放位置

ServletFileUpload sf =new ServletFileUpload(ff);

       List list=sf.parseRequest(request);//开始解析

for(FileItem it:list){//获得文件名。以及用到uuid解决重名的问题

FileUtils.copyInputStreamToFile(it.getInputStream(), new File(path+"/"+filename));//写的指定的文件夹中

}

1、前台代码:

上传文件

File1 name="file"/>

请输入名称:name="desc"/>

File2 name="file"/>

请输入名称: name="desc"/>

2、后台代码:

2-1首先创建一个基于硬盘的工厂,用来存放临时文件

//指定临时存放位置

File f = new File("F:/ex/temp");//指定临时文件存放位置

DiskFileItemFactory ff =new DiskFileItemFactory(1024*1024*5, f);//临时文件的大小和存放位置

2-2 创建一个用ServletFileUpload对象,并且设置文件大小,最大允许传多大的文件

//创建用于解析的对象

ServletFileUpload sf =new ServletFileUpload(ff);

sf.setFileSizeMax(1024*1024*10);//仅仅允许单个存放位置最大值是 10M

sf.setSizeMax(1024*1024*20);//所有文件的最大值是20M

String path =this.getServletContext().getRealPath("/imgs");

System.out.println("存储路径:"+path);

2-3 开始解析对象

//映射名String id=UUID.randomUUID().toString().replace("-", "");//全球唯一UUId来进行//文件名String lastname=name.substring(name.lastIndexOf("."));//文件格式//名字文件格式都找到了---组合String filename =id+lastname;//新的文件名//拷贝流。让它写到相应位置FileUtils.copyInputStreamToFile(it.getInputStream(), new File(path+"/"+filename));//path为存储的绝对路径--之前定义的}

这样能实现简单的上传,但是,这种上传是没有一点安全行了。完整的代码中附上了防一般的小问题还是没问题的

选择文件之后

查看web服务器img里面的文件,文件已经上传到该页面《文件名为uuid生成的文件名》

文件上传源代码:

以上就是本文的全部内容,希望对大家的学习有所帮助。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:详解Java编程中final,finalize,finally的区别
下一篇:详解Java异常处理中throw与throws关键字的用法区别
相关文章

 发表评论

暂时没有评论,来抢沙发吧~