Java EE之通过表单上传文件

Posted gzhjj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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前后台开发之文件上传

Java EE之servlet处理表单提交的请求

java Ftp上传创建多层文件的代码片段

android的自带的httpClient 怎么上传文件

eclipse用法之java中文件的上传操作

如何通过表单上传文件并让 Java 将其作为 InputStream 处理? [复制]