package com.kso.test;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

@WebServlet({ "/HelloServlet" })
public class HelloServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private static String s_fileName = "";

    ByteArrayOutputStream output;

    /**
     * 下载文件
     * 
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String filename = request.getParameter("name");
        if (filename == null || filename.isEmpty()) {
            out.print("please set file name ");
        } else {
            // 假设文件都在服务的根目录下
            String realFileName = request.getServletContext().getRealPath("/") + filename;
            System.out.println(realFileName);
            // 实例化一个向客户端输出文件流
            OutputStream outputStream = response.getOutputStream();
            // 输出文件用的字节数组，每次向输出流发送600个字节
            byte b[] = new byte[600];
            // 要向客户端输出的文件
            File fileload = new File(realFileName);
            System.out.println(filename);
            String utf8filename = URLEncoder.encode(filename, "UTF-8");
            System.out.println(utf8filename);
            response.setHeader("Content-disposition", "attachment; filename=" + utf8filename);
            // 通知客户端：文件的MIME类型
            response.setContentType("application/msword");
            // 通知客户端：文件的长度
            long fileLength = fileload.length();
            String length = String.valueOf(fileLength);
            response.setHeader("Content-length", length);
            // 读取文件，并发送给客户端下载
            FileInputStream inputStream = new FileInputStream(fileload);
            int n = 0;
            while ((n = inputStream.read(b)) != -1) {
                outputStream.write(b, 0, n);
            }
            inputStream.close();
            outputStream.close();
        }
    }

    /**
     * 上传文件
     * 
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        System.out.println("添加任务");
        HttpSession session = request.getSession();
        Cookie[] cookies = request.getCookies();
        String value = "";

        try {
            DiskFileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload((FileItemFactory) factory);
            upload.setHeaderEncoding("UTF-8");

            List items = upload.parseRequest(request);
            boolean isOk = false;
            Map<Object, Object> param = new HashMap<>();
            for (Object object : items) {
                FileItem fileItem = (FileItem) object;
                if (fileItem.isFormField()) {
                    System.out.println(fileItem.getFieldName() + ":" + fileItem.getString("utf-8") + ", size:"
                            + fileItem.getSize());
                    param.put(fileItem.getFieldName(), fileItem.getString("utf-8"));
                    continue;
                }
                String fieldName = fileItem.getFieldName();
                // 必须要有文件名，需要客户端传参时注意
                String fileName = fileItem.getName();
                if (fileName.equals("blob"))
                    if (param.containsKey("filename")) {
                        fileName = param.get("filename").toString();
                    } else if (param.containsKey("fileName")) {
                        fileName = param.get("fileName").toString();
                    }
                String filePath = request.getSession().getServletContext().getRealPath("/") + fileName;
                System.out.println(fieldName + ":" + filePath);

                FileOutputStream fileOut = new FileOutputStream(filePath);
                InputStream in = fileItem.getInputStream();
                byte[] buffer = new byte[1024];
                int len = 0;
                while ((len = in.read(buffer)) > 0) {
                    fileOut.write(buffer, 0, len);
                }
                in.close();
                fileOut.close();
                response.setHeader("Content-disposition", "attachment; filename*=UTF-8''" + fileName);
                response.getWriter().write(fileName.concat("上传成功"));

                return;
            }
        } catch (FileUploadException e) {

            e.printStackTrace();
        }

        response.sendError(404, "no ssison");
    }
}