文件上传初步

Servlet/Filter/Listener/ - 单一的实例.html

- 被Tomcat维护浏览器

 

文件上传与下载服务器

 

1:文件上传

  要求:app

1:文件上传必须是表单。由于get方式发送的字节最可能是:4K(1024*4bytes)jsp

2:必须是post,且表单的类型必须是enctype=multipart/form-data.post

 

 

2.1 : 当设置上面的选项之后,影响的是请求头的中的性能

    Content-type :  编码

请求的类型url

enctype表单上的设置spa

请示头中的值

get

不管如何设置

Content-Type:null

post

默认

Content-type: application/x-www-form-urlencoed

post

Multipart/form-data

Content-type:multipart/form-data;boundary=--------kdkhfgjdjd

上面的随机值,用于分割上传的多个文件

 

3:若是将enctype=multipart/form-data则后台的request.getParameter(...);失效再也获取不到参数了

   只能经过request.getInputStream来接收上传的二进制数据。

 

4:若是要文件上传则应该在<form>表单中使用<input type=file/>类型的元素。

 

 

 

 

2:关于content-type

c如下是get请求:

 

 

 如下是post请求:

 

修改请求的编码类型:

   <form method="post"  action="abc.jsp" enctype="multipart/form-data">

Name:<input type="text" name="name">

<br>

Addr :<input type="text" name="addr">

<br>

<input type="submit">

</form>

 

 

 

 

 

 

3:上传一个文本文件

步1:开发一个表单

<form method="post"  action="up01" enctype="multipart/form-data">

请选择文本文件:<input type="file" name="txtFile">

<br>

<input type="submit">

</form>

 

步2:开发一个Servlet用req.getInputStream来接收传的正文

protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

request.setCharacterEncoding("UTF-8");

// 1:获取请求的二进制数据

InputStream in = request.getInputStream();

byte[] bs = new byte[1024];

int len = 0;

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

String str = new String(bs, 0, len);

System.err.print(str);

}

in.close();

}

 

如下是拦截到的请求过程:

 


如下是IE上传时的文件名是整个文件名:

-----------------------------7e02fc1fd0790

Content-Disposition: form-data; name="txtFile"; filename="C:\Users\wangjian\Desktop\20160509_PM3_文件上传下载\新文本.txt"

Content-Type: text/plain

 

Hello

��Һ�

-----------------------------7e02fc1fd0790--

 

 

步3:解析出文件名

解析的思想是:

   

 

步4:解析出文件名来之后,再去解析正文

思想:

  

 

步5:保存到服务器上去

// 获取这个文件的真实的目录

String path = getServletContext().getRealPath("/files");

PrintWriter ps = new PrintWriter(new File(path, fileName));

ps.println(str);

ps.println(str2);

ps.close();

 

 

 

 

4:使用第三方组件实现上传

 

上传组组件

公司

性能

Apache-fileupload

Apache/org

中高 - 普遍

Cos    -  0.9

小公司

高 简单 没有依赖

Jspsmart-fileupload

 

200M崩溃

 

 

 

 

要求导入两个包:

 

 

 

步1:开发页面

 

步2:开发后台

 

核心类:

  DiskFIleItemFactory - 用于指定临时目录。

  ServletFileUpload - 用于解析Request,从里面获取上传的文件对象。

  FileItem - >表示一个文件。

 

/**

 * Servlet implementation class Up02Servlet

 */

public class Up02Servlet extends HttpServlet {

private static final long serialVersionUID = 1L;

 

protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

request.setCharacterEncoding("UTF-8");

// 1:声明服务器上的临时文件目录

DiskFileItemFactory disk = new DiskFileItemFactory();

File file = new File("d:/a");

if (file.exists()) {

disk.setRepository(file);// 若是这个目录存在,则使用这个目录,不然就是系统的临时目录

}

// 2:解析requst,接收临时目录

ServletFileUpload upload = new ServletFileUpload(disk);

try {

// 3解析

List<FileItem> list = upload.parseRequest(request);

// 因为只有一个文件,因此获取o

FileItem item = list.get(0);

//解析出文件的名称

String fileName = item.getName();

fileName = fileName.substring(fileName.lastIndexOf("\\")+1);

 

//文件上传

//上传到的真实的目录

String path = getServletContext().getRealPath("/files");

//能够上传的方式:1:文件copy,

//2:直接使用FileItem的方法

item.write(new File(path,fileName));

//删除临时文件

//item.delete();

} catch (Exception e) {

e.printStackTrace();

}

}

}

 

<form method="post"  action="up02" enctype="multipart/form-data">

请选择文件:<input type="file" name="txtFile">

<br>

<input type="submit">

</form>

 

 

 

3:将上传的文件的信息,在一个页面显示

  1:文件的大小

  2:文件的名称。

  3:文件的类型 mime-type。Plain/text  text/html   

 

 

  request.setAttribute("fileName", fileName);

request.setAttribute("type", item.getContentType());//

request.setAttribute("szie", item.getSize());

 

 

<body>

文件名:${fileName}

<br>

大小:${szie} bytes

<br>

类型:${type}

</body>

 

 

 

 

4:下载文件

两种方式:

1:超链接 。

  <body>

<a href="files/commons.jar">下载</a>

</body>

 

 

2:代码下载

 

 

public class Down01Servlet extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//获取这个文件的真实的目录

String path = getServletContext().getRealPath("/files/commons.jar");

//2:获取这个文件的io

InputStream in =

new FileInputStream(path);

//3:通知浏览器这是文件下载

response.setContentType("application/force-download");

//4:建议修改文件名

String name = "这是一个压缩文件.jar";

name = URLEncoder.encode(name, "UTF-8");

response.setHeader("Content-Disposition","attachment;filename="+name);

//5:获取输出流

OutputStream out = response.getOutputStream();

byte[] bs  = new byte[1024*4];

int len = 0;

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

out.write(bs, 0, len);

}

out.close();

in.close();

}

 

}

相关文章
相关标签/搜索