servlet实现文件上传与下载功能

网友投稿 566 2023-02-04

servlet实现文件上传与-功能

servlet实现文件上传与-功能

本文实例为大家分享了servlet实现文件上传与-的具体代码,供大家参考,具体内容如下

内容

我们分两大模块来进行讲解,即上传的实现,与-的实现

上传的实现

注意了我们在写上传表单的时候必须声明提交方式为post类型,enctype="multipart/form-data",这样的话才能实现上传。

当我们提交表单的时候看看响应体中都有什么内容:

好了,我们有了数据了,接下来我们怎么提取数据呢,注意我们已经不能使用requeest.getParamter()方法来进行参数的提取了,那怎么办呢,我们总不能自己写实现类来进行分割吧!我们可以使用Commons提供的小工具。

好了,让我们来看看具体的操作步骤吧!这里我就不详细说了,一文代码流过:

/**

* 需要解决的问题:

* 1 必须要把文件存放到WEB-INF目录下,避免用户看到

* 2 文件名相关问题

* 1 有的浏览器会传递绝对路径到name中,我们只需要进行拆分即可

* 2文件重名问题,我们可以使用uuid

* 3文件名乱码问题,我们已经解决了。即request.setCharacterEncoding("utf-8");

* 3 文件打散问题

* 1通过首字符打散

* 2通过时间打散

* 3通过hash打散

* 4上传文件大小限制

* 1单个文件上传大小限制

* 2总文件上传大小限制

* 设置这两个参数时,我们必须在没有解析之前执行。

* 5 缓存大小与临时目录

*

*

*

**/

public class FileUploadServlet extends HttpServlet {

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

request.setCharacterEncoding("utf-8");

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

/**

* 我们使用commmons的小工具来进行编码

* 设置jsp页面的enctype= “multipart/form-data“;

* 1 创建FileItem工厂

* 2创建ServletFileUpload对象

* 3 解析request得到FileItem

* 4对FileItem进行操作

**/

String path = request.getSession().getServletContext().getRealPath("/WEB-INF");

//解决缓存大小,要不然你的内存会爆的。

DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(1024 * 10,new File(path + "/" + "tmp2") );

ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);

List l = null;

try {

l = fileUpload.parseRequest(request);

FileItem f2 = l.get(0);

//解决文件存放在WEN_INF目录下问http://题

path = path + "/tmp";

//解决浏览器传递绝对路径问题

String name = f2.getName();

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

if(i != -1) {

name = name.substring(i);

}

//解决文件重名问题

name = (UUID.randomUUID().toString().replace("-","").trim()) + name;

//文件打散问题解决方法演示之hash打散

int has = name.hashCode();

//转换位16进制位,我们使用前两个值来判断

String hex = Integer.toHexString(has);

path = path + "/" + hex.charAt(0) + "/" + hex.charAt(2) ;

File file = new File(path);

if(! file.exists()) {

file.mkdirs();

}

f2.write(new File(path + "/" + name));

request.setAttribute("msg","恭喜你,上传成功了!");

request.getRequestDispatcher("/index.jsp").forward(request, response);

} catch (Exception e) {

request.setAttribute("msg",e.getMessage());

request.getRequestDispatcher("/index.jsp").forward(request, response);

}

}

}

好了,上传的问题基本就解决了。

-的实现

下面我们来看一下-问题的解决方案

-文件是我们必须来设置两个响应头,设置Content-Disposition:它的默认值为inline,表示在浏览器窗口中打开!attachment;filename=xxx要不然我们输出的内容不会弹出保存框,只会显示在浏览器中。

设置Content-Type:你传递给客户端的文件是什么MIME类型

然后我们就可以new一个输入流来读取本地硬盘中的文件,在输出到ServleoutputStream中

在来一行代码流过:

public void doGet(HttpServletRequest request, HttpServletResponse http://response)

throws ServletException, IOException {

/**

* 设置两个响应头

* 1Content-Type:你传递给客户端的文件是什么MIME类型

* 2Content-Disposition:它的默认值为inline,表示在浏览器窗口中打开!attachment;filename=xxx

*

* 需要解决的的问题:

* 1 -文件名中文乱码问题

* 解决方法:

* 针对不同的浏览器使用不同的编码方式 火狐浏览器使用的是Base64编码,其他浏览器一般都是使用url编码

**/

String mimeType = request.getSession().getServletContext().getMimeType(AyeVJfehgY"\\WEB-INF\\tmp\\2\\5\\"

+ "87bd61a4b7c346a5a2e6c072de84acda5.JdbcUtils处理多线程并发访问问题.avi");

//解决文件名乱码问题

String filename = "87bd61a4b7c346a5a2e6c072de84acda5.JdbcUtils处理多线程并发访问问题.avi";

filename = encoding(filename, request);

//两个请求头

response.setHeader("Content-Type",mimeType);

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

ServletOutputStream out = response.getOutputStream();

String path = request.getSession().getServletContext().getRealPath("\\WEB-INF\\tmp\\2\\5\\"

+ "87bd61a4b7c346a5a2e6c072de84acda5.JdbcUtils处理多线程并发访问问题.avi");

File file = new File(path);

FileInputStream inputStream = new FileInputStream(file);

IOUtils.copy(inputStream, out, 1024*1024);

}

private String encoding(String filename,HttpServletRequest req) throws UnsupportedEncodingException {

String user_agent = req.getHeader("User-Agent");

String encodingFileName = null;

if(user_agent.contains("Firefox")) {

//按道理来说应该使用 BASE64Encoder进行编码,但是不知道为什么不能成功

/*BASE64Encoder base64Encoder = new BASE64Encoder();

encodingFileName = "=?utf-8?B?"

+ base64Encoder.encode(filename.getBytes("utf-8"))

+ "?=";*/

//那我们只能使用这种方式了

encodingFileName = new String(filename.getBytes("UTF-8"), "ISO-8859-1");

}

else {

encodingFileName = URLEncoder.encode(filename,"utf-8");

}

return encodingFileName;

}

}

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

上一篇:详解Spring事务回滚和事务提交
下一篇:信息安全前端技术(前端安全处理)
相关文章

 发表评论

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