Java EE之通过表单上传文件
public class Ticket
{
private String customerName;
private String subject;
private String body;
private Map<String, Attachment> attachments = new LinkedHashMap<>();
//...
}
public class Attachment
{
private String name;
private byte[] contents;
//...
}
@WebServlet(
name = "ticketServlet",
urlPatterns = {"/tickets"},
loadOnStartup = 1
)
@MultipartConfig(
fileSizeThreshold = 5_242_880, //5MB
maxFileSize = 20_971_520L, //20MB
maxRequestSize = 41_943_040L //40MB
)
//@MultipartConfig的location告诉浏览器应该在哪里存储临时文件(这里未使用,让应用服务器使用它的默认临时目录即可)
//fileSizeThreshold将告诉Web容器文件必须达到多大才能写入到临时目录中(在本例中,小于5MB的上传文件将保存在内存中。)
//在本例中,maxFileSize设置将禁止上传大小超过20MB的文件。
//在本例中,maxRequestSize设置禁止大小超过40MB的请求。
public class TicketServlet extends HttpServlet
{
//...
}
public class TicketServlet extends HttpServlet
{
//...
//downloadAttachment方法用于处理客户端浏览器的下载请求。
private void downloadAttachment(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
//...
//响应中设置的头Content-Disposition,将强制浏览器询问客户是
//保存还是下载文件,而不是在浏览器中在线打开该文件。
response.setHeader("Content-Disposition",
"attachment; filename=" + attachment.getName());
response.setContentType("application/octet-stream");
//使用ServletOutputStream将文件内容输出到响应中(对大文件处理存在内存问题)
ServletOutputStream stream = response.getOutputStream();
stream.write(attachment.getContents());
}
//...
}
public class TicketServlet extends HttpServlet
{
//...
private void createTicket(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
Ticket ticket = new Ticket();
ticket.setCustomerName(request.getParameter("customerName"));
ticket.setSubject(request.getParameter("subject"));
ticket.setBody(request.getParameter("body"));
Part filePart = request.getPart("file1");
if(filePart != null && filePart.getSize() > 0)
{
Attachment attachment = this.processAttachment(filePart);
if(attachment != null)
ticket.addAttachment(attachment);
}
int id;
synchronized(this)
{
id = this.TICKET_ID_SEQUENCE++;
this.ticketDatabase.put(id, ticket);
}
response.sendRedirect("tickets?action=view&ticketId=" + id);
}
private Attachment processAttachment(Part filePart)
throws IOException
{
//从multipart请求中获得InputStream,并将它复制到Attachment对象中。
InputStream inputStream = filePart.getInputStream();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int read;
final byte[] bytes = new byte[1024];
while((read = inputStream.read(bytes)) != -1)
{
outputStream.write(bytes, 0, read);
}
Attachment attachment = new Attachment();
attachment.setName(filePart.getSubmittedFileName());
attachment.setContents(outputStream.toByteArray());
return attachment;
}
//...
}
文章的源码链接:https://pan.baidu.com/s/1ZnkwhlZo6_ihutdbgA7FvQ 密码:q33p
其他关于文件上传的源码链接:https://pan.baidu.com/s/1PW-sdelXD6i3S3deFmVi0g 密码:v7hd
《Java Web高级编程》示例代码的下载地址:http://www.wrox.com/go/projavaforwebapps
参考:《Java Web高级编程》第3章 第6节
Java EE之通过表单上传文件的更多相关文章
- Java如何解决form表单上传文件,以及页面返回处理结果通知!
前端JSP代码 <form id='formSumbit' class='form-horizontal' action='/ncpay/route/chlsubmcht/batchImpor' ...
- java模拟表单上传文件,java通过模拟post方式提交表单实现图片上传功能实例
java模拟表单上传文件,java通过模拟post方式提交表单实现图片上传功能实例HttpClient 测试类,提供get post方法实例 package com.zdz.httpclient; i ...
- from 表单上传文件和下载?
from表单上传单个文件的方法. 分为三个部分,简单演示. 一部分 表单上传文件 <%-- Created by IntelliJ IDEA. User: Administrator Date: ...
- django 基于form表单上传文件和基于ajax上传文件
一.基于form表单上传文件 1.html里是有一个input type="file" 和 ‘submit’的标签 2.vies.py def fileupload(request ...
- Express下使用formidable实现POST表单上传文件并保存
Express下使用formidable实现POST表单上传文件并保存 在上一篇文章中使用formidable实现了上传文件,但没将它保存下来. 一开始,我也以为是只得到了文件的相关信息,需要用fs. ...
- 巨蟒python全栈开发django11:ajax&&form表单上传文件contentType
回顾: 什么是异步? 可以开出一个线程,我发出请求,不用等待返回,可以做其他事情. 什么是同步? 同步就是,我发送出了一个请求,需要等待返回给我信息,我才可以操作其他事情. 局部刷新是什么? 通过jq ...
- vue form表单上传文件
<script src="https://cdn.staticfile.org/vue-resource/1.5.1/vue-resource.min.js">< ...
- 使用form表单上传文件
在使用form表单上传文件时候,input[type='file']是必然会用的,其中有一些小坑需要避免. 1.form的 enctype="multipart/form-data" ...
- JsonResponse类的使用、form表单上传文件补充、CBV和FBV、HTML的模板语法之传值与过滤器
昨日内容回顾 Django请求生命周期 # 1.浏览器发起请求 到达Django的socket服务端(web服务网关接口) 01 wsgiref 02 uwsgi + nginx 03 WSGI协议 ...
随机推荐
- 【坚持】Selenium+Python学习记录 DAY9
2018/05/29 [来源:菜鸟教程](http://www.runoob.com/python3/python3-examples.html) 运算符重载 https://segmentfault ...
- arp与rarp
- 用线性分类器实现预测鸢尾花的种类(python)
这是个人学习时跑的代码,结果就不贴了,有需要的可以自己运行,仅供参考,有不知道的可以私下交流,有问题也可以联系我.当然了我也只能提供一点建议,毕竟我也只是初学者 第一个页面 # -*- coding: ...
- 用Solidity在Truffle上构建一个HelloWorld智能合约
原文地址:石匠的blog Truffle的环境安装在前文已经整理,这次用Solidity在Truffle写一个HelloWorld以太坊智能合约,并在testrpc上进行测试.当前的软件版本信息如下: ...
- bootstrap table的展开行问题
照着网上与api里说的添加detailView属性设置为true,detailFormatter属性为展开后的内容,但是设置之后发现,在表格每一行最前面是多出一列正常该显示"+"的 ...
- 结对项目:SudokuGame
1. Github项目地址:https://github.com/ZiJiaW/SudokuGame GUI在BIN目录下的SudokuGUI.rar中,解压后打开SudokuGame.exe即可.2 ...
- java实验二实验报告
一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计模式 二.实验过程(本次试验都 ...
- Task 6.2冲刺会议五 /2015-5-18
今天继续深入的看了看服务器的内容,修改了昨天的代码,发现网络编程还是很好玩的,感觉他的代码比平常写的更有趣一点,另外登陆界面也稍微看了一点.明天准备把登陆界面完善一下.
- 【图论】POJ-3723 最大生成树
一.题目 Description Windy has a country, and he wants to build an army to protect his country. He has p ...
- mvc 路由配置-学习
MapRoute(RouteCollection, String, String) 映射指定的URL路由. 'Declaration <ExtensionAttribute> _ Publ ...