/**
 * 远程服务下载类
 *
 * @author jiyanle.
 * @date 2015/6/17
 */
@Controller
@RequestMapping(value = "download")
public class FileDownload extends BaseController {

    /**
     * 远程服务器文件下载
     *
     * @param request
     * @param response
     * @param fileDir  文件目录,相对于根目录
     * @param fileName 指定下载保存后的文件名(含扩展名)
     * @return
     */
    @RequestMapping(value = "downloadFile")
    public String downloadFile(HttpServletRequest request, HttpServletResponse response, String fileDir, String fileName) {
        PrintWriter out = null;
        // 目标远程服务器文件地址
        String path = GlobalConfig.getImgServer() + "/" + fileDir;
        try {
            out = response.getWriter();
            File file = new File(path);

            // 以流的形式下载文件。
            URL url = new URL(path);
            HttpURLConnection uc = (HttpURLConnection) url.openConnection();
            uc.connect();

            // 远程服务器调用
            InputStream fis = new BufferedInputStream(uc.getInputStream()); //url.openStream(); //new BufferedInputStream(new FileInputStream(path));//本地服务器调用
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();
            // 清空response
            response.reset();
            response.setCharacterEncoding("utf-8");

            //解决各浏览器的中文乱码问题
            String userAgent = request.getHeader("User-Agent");
            byte[] bytes = userAgent.contains("MSIE") ? fileName.getBytes() : fileName.getBytes("UTF-8"); // fileName.getBytes("UTF-8")处理safari的乱码问题
            fileName = new String(bytes, "ISO-8859-1"); // 各浏览器基本都支持ISO编码

            response.addHeader("Content-Disposition", String.format("p_w_upload; filename=\"%s\"", fileName)); //"p_w_upload;filename=" + toUtf8String(fileName));
            response.addHeader("Content-Length", "" + uc.getHeaderField("Content-Length"));
            response.setContentType("application/octet-stream");
            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
            toClient.write(buffer);
            toClient.flush();
            toClient.close();
        } catch (Exception e) {
            if (e instanceof FileNotFoundException) {
                out.print("服务器文件丢失!");
            } else {
                out.print("下载异常");
            }
        }
        return null;
    }

}