@WebServlet(name = "ticketServlet",urlPatterns = {"/tickets"},loadOnStartup = 1)
@MultipartConfig(fileSizeThreshold = 5242880,
maxFileSize = 20971520L,//20MB
maxRequestSize = 41943040L//40MB
)
public class TicketServlet extends HttpServlet{
//线程可见性
private volatile int TICKET_ID_SEQUENCE = 1;
private Map<Integer,Ticket> ticketDatabase = new LinkedHashMap<>(); @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
//使用请求参数做了一个菜单
String action = req.getParameter("action");
if (action == null){
action = "list";//默认ticket列表
}
switch (action){
case "create":
this.showTicketForm(resp);//展示表单
break;
case "view":
this.viewTicket(req,resp);//具体一张
break;
case "download":
this.downloadAttachment(req,resp);//下载附件
break;
default:
this.listTickets(resp);//展示ticket
break;
}
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String action = req.getParameter("action");
if(action == null){
action = "list";
}
switch (action){
case "create":
this.createTicket(req,resp);//表单提交实际创建方法
break;
case "list":
default:
resp.sendRedirect("tickets");//重定向 get
break; } } private void listTickets(HttpServletResponse response) throws IOException {
PrintWriter writer = this.writeHeader(response); writer.append("<h2>Tickets</h2>\r\n");
//createTicket入口 先展示一个表单
writer.append("<a href=\"tickets?action=create\">Create Ticket")
.append("</a><br/><br/>\r\n"); if(this.ticketDatabase.size() == 0)
writer.append("<i>There are no tickets in the system.</i>\r\n");
else
{
for(int id : this.ticketDatabase.keySet())
{
String idString = Integer.toString(id);
Ticket ticket = this.ticketDatabase.get(id);
writer.append("Ticket #").append(idString)
.append(": <a href=\"tickets?action=view&ticketId=")
.append(idString).append("\">").append(ticket.getSubject())
.append("</a> (customer: ").append(ticket.getCustomerName())
.append(")<br/>\r\n");
}
} this.writeFooter(writer);
} private void viewTicket(HttpServletRequest request, HttpServletResponse response) throws IOException {
//从ticket列表进入某张ticket所需要id
String idString = request.getParameter("ticketId");
Ticket ticket = this.getTicket(idString, response);
if(ticket == null)
return; PrintWriter writer = this.writeHeader(response); writer.append("<h2>Ticket #").append(idString)
.append(": ").append(ticket.getSubject()).append("</h2>\r\n");
writer.append("<i>Customer Name - ").append(ticket.getCustomerName())
.append("</i><br/><br/>\r\n");
writer.append(ticket.getBody()).append("<br/><br/>\r\n"); if(ticket.getNumberOfAttachments() > 0)
{
writer.append("Attachments: ");
int i = 0;
for(Attachment attachment : ticket.getAttachments())
{
if(i++ > 0)
writer.append(", ");
writer.append("<a href=\"tickets?action=download&ticketId=")
.append(idString).append("&attachment=")
.append(attachment.getName()).append("\">")
.append(attachment.getName()).append("</a>");
}
writer.append("<br/><br/>\r\n");
} writer.append("<a href=\"tickets\">Return to list tickets</a>\r\n"); this.writeFooter(writer);
} private Ticket getTicket(String id, HttpServletResponse response) throws IOException {
//id.len == '' 一般合法性检查 有没有
if (id == null || id.length()==0){
response.sendRedirect("tickets");
return null;
}
try {
Ticket ticket = this.ticketDatabase.get(Integer.parseInt(id));
if (ticket == null) {
response.sendRedirect("tickets");
return null;
}
return ticket;
}catch (Exception e){
response.sendRedirect("tickets");
return null;
}
} private void showTicketForm(HttpServletResponse resp) throws IOException {
PrintWriter writer = this.writeHeader(resp);
writer.append("<h2>Create a Ticket</h2>\r\n");
writer.append("<form method=\"POST\" action=\"tickets\" ")
.append("enctype=\"multipart/form-data\">\r\n");//编码类型multipart/form-data
writer.append("<input type=\"hidden\" name=\"action\" ")//隐藏域提交 action value = create
.append("value=\"create\"/>\r\n");
writer.append("Your Name<br/>\r\n");
writer.append("<input type=\"text\" name=\"customerName\"/><br/><br/>\r\n");
writer.append("Subject<br/>\r\n");
writer.append("<input type=\"text\" name=\"subject\"/><br/><br/>\r\n");
writer.append("Body<br/>\r\n");
writer.append("<textarea name=\"body\" rows=\"5\" cols=\"30\">")
.append("</textarea><br/><br/>\r\n");
writer.append("<b>Attachments</b><br/>\r\n");
writer.append("<input type=\"file\" name=\"file1\"/><br/><br/>\r\n");
writer.append("<input type=\"submit\" value=\"Submit\"/>\r\n");
writer.append("</form>\r\n"); this.writeFooter(writer);
} private void downloadAttachment(HttpServletRequest request, HttpServletResponse response) throws IOException {
//下载某一个attachment
String idString = request.getParameter("ticketId");
Ticket ticket = this.getTicket(idString, response);
if(ticket == null)
return; String name = request.getParameter("attachment");
if(name == null)
{
response.sendRedirect("tickets?action=view&ticketId=" + idString);
return;
} Attachment attachment = ticket.getAttachment(name);
if(attachment == null)
{
response.sendRedirect("tickets?action=view&ticketId=" + idString);
return;
}
//header 内容位置 文件名
response.setHeader("Content-Disposition",
"attachment; filename=" + attachment.getName()); response.setContentType("application/octet-stream");
//流
ServletOutputStream stream = response.getOutputStream();
stream.write(attachment.getContents());
} private void createTicket(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
Ticket ticket = new Ticket();
ticket.setCustomerName(req.getParameter("customerName"));
ticket.setSubject(req.getParameter("subject"));
ticket.setBody(req.getParameter("body")); Part filePart = req.getPart("file1");
if (filePart!=null){
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);
}
resp.sendRedirect("tickets?action=view&ticketId="+id);
} private Attachment processAttachment(Part filePart) throws IOException {
InputStream inputStream = filePart.getInputStream();//用户输入流
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();//写入attachment做准备 int read;
final byte[] bytes = new byte[1024];//buffer
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;
} private PrintWriter writeHeader(HttpServletResponse response)
throws IOException
{
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8"); PrintWriter writer = response.getWriter();
writer.append("<!DOCTYPE html>\r\n")
.append("<html>\r\n")
.append(" <head>\r\n")
.append(" <title>Customer Support</title>\r\n")
.append(" </head>\r\n")
.append(" <body>\r\n"); return writer;
} private void writeFooter(PrintWriter writer)
{
writer.append(" </body>\r\n").append("</html>\r\n");
} }

【文件下载细节】

 //header 内容位置   文件名
response.setHeader("Content-Disposition",
"attachment; filename=" +
new String(attachment.getName().getBytes("UTF-8"),"ISO8859-1"));//浏览器支持的编码是ISO8859-1
response.setContentType("application/octet-stream");
//流
ServletOutputStream stream = response.getOutputStream();
stream.write(attachment.getContents());
												

Servlet 起航 文件上传 中文文件名下载的更多相关文章

  1. jsp+servlet实现文件上传下载

    相关素材下载 01.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  2. java commons-fileupload servlet 多文件上传

    commons-fileupload servlet 多文件上传 需要引入的 jar 包. commons-fileupload-1.3.2.jar commons-io-2.2.jar 工程路劲:查 ...

  3. Servlet实现文件上传

    一.Servlet实现文件上传,需要添加第三方提供的jar包 下载地址: 1) commons-fileupload-1.2.2-bin.zip      :   点击打开链接 2) commons- ...

  4. 完美解决ExtJs6上传中文文件名乱码,后端SpringMVC

    ExtJs上传中文文件名乱码,观察请求. ExtJs6上传乱码从后台无法解决,因为文件名请求里面就已经乱码了,后台无法解码. 除非请求参数正确没有乱码,后台因为编码设置不一样,可以通过后台处理乱码 这 ...

  5. Servlet实现文件上传,可多文件上传

    一.Servlet实现文件上传,需要添加第三方提供的jar包 接着把这两个jar包放到 lib文件夹下: 二: 文件上传的表单提交方式必须是POST方式, 编码类型:enctype="mul ...

  6. 配置servlet支持文件上传

    Servlet3.0为Servlet添加了multipart配置选项,并为HttpServletRequest添加了getPart和getParts方法获取上传文件.为了使Servlet支付文件上传需 ...

  7. servlet实现文件上传,预览,下载和删除

      一.准备工作 1.1 文件上传插件:uploadify: 1.2 文件上传所需jar包:commons-fileupload-1.3.1.jar和commons-io-2.2.jar 1.3 将数 ...

  8. Servlet实现文件上传和下载

    对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具commo ...

  9. Servlet中文件上传下载

    1.文件下载: package FileUploadAndDown; import java.io.FileInputStream; import java.io.IOException; impor ...

随机推荐

  1. Uva796 Critical Links

    用tarjan缩点 然后用dfn[u] < low[v]缩点并且保存起来 在sort一遍输出 #include<stdio.h> #include<string.h> # ...

  2. [FJOI2015]火星商店问题(分治+可持久化)

    题目描述 火星上的一条商业街里按照商店的编号1,2 ,…,n ,依次排列着n个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非负整数val来标价.每个商店每天都有可能进一些新商品,其标价可能与已 ...

  3. UVA10559 Blocks(区间dp)

    有n个带有颜色的方块,没消除一段长度为x的连续的相同颜色的方块可以得到x^2的分数,让你用一种最优的顺序消除所有方块使得得分最多. 输入格式 第一行包含测试的次数t(1≤t≤15) 每个案例包含两行. ...

  4. 【算法】php实现斐波那契数列

    斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21.这个数列从第3项开始,每一项都等于前两项之和. 根据这个定义,斐波那契数列的递推公式是:f(n)=f(n-1)+f(n ...

  5. CAS与ABA问题产生和解决

    乐观锁和悲观锁 Synchronized属于悲观锁,悲观地认为程序中的并发情况严重,所以严防死守.CAS属于乐观锁,乐观地认为程序中的并发情况不那么严重,所以让线程不断去尝试更新. 性能对比: Syn ...

  6. C# winfrom 递归(城市名)

    递归的定以:递归在运行过程中,自己调用自己的过程: List<ChinaStates> list = new ChinaData().SelectAll();//查询所有中国的城市的方法: ...

  7. 如何使用Senparc.Weixin SDK 底层的Redis缓存并设置过期时间

    最近在微信第三方平台项目开发中,有一个需求,所有绑定的公众号的回复规则按照主公众号的关键词配置来处理,我的处理思路是获取主公众号配置的关键词回复规则,缓存10分钟,由于需要使用Redis缓存来存储一些 ...

  8. TestNg 6.异常测试

    * 什么时候会用到异常测试??* 在我们期望结果为某一个异常的时候* 比如:我们传入了某些不合法的参数,程序抛出异常* 也就是我的预期结果就是这个异常看以下的一段代码: package com.cou ...

  9. Docker下安装Influxdb-1.6.1和Grafana5.2.2

    第一步.安装Influxdb 首先启动docker systemctl start docker 然后安装Influxdb(这里解释一下为啥用docker,因为官网下载的话需要FQ[fan-qiang ...

  10. iptables防火墙设置

    ubuntu系统: apt-get install iptables #如果默认没有安装,请运行此命令安装防火墙 # whereis iptables #查看系统是否安装防火墙可以看到:iptable ...