夜隼

RYSZ

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
wap开发中,每一个src或者href的数据都可能来自本地,网络,或者socket
java中可以直接读取网络流,.net下好像读取网络流会有点问题(不支持查询),好像需要现保存后读取

public void RequestFile(HttpServletRequest request, HttpServletResponse response) {    
        
        String serverurl = "";
        if (request.getParameter("serverurl") != null)
            serverurl = request.getParameter("serverurl");
               
        if(serverurl.startsWith("file:"))
            serverurl = serverurl.substring(5);

        // 需要考虑多种情况,本地下载,网络下载,SOCKET下载等等
        // url = HttpHelper.decode(url);
        InputStream inStream = null;
        if (url.toLowerCase().startsWith("http://")) {
            // 网络文件           
            HttpClient httpClient = new HttpClient();
            GetMethod getHC = new GetMethod(url);           
            try {
                int statusCode = httpClient.executeMethod(getHC);
                if (statusCode == HttpStatus.SC_OK) {
                    inStream = getHC.getResponseBodyAsStream();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
           
            View(inStream, url, response);
           
        }
        else if (!serverurl.startsWith("?")){
            // 本地文件
            serverurl = WapRoot + request.getSession().getAttribute("appfolder") + File.separatorChar + serverurl;
            try {
                inStream = new FileInputStream(serverurl);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            View(inStream, serverurl, response);
        }
        else {
            // socket文件
            //需要判断socket头是是下载,还是预览?
            //重构socket地址和post数据
            String postData = "";
            //注意postData格式!!!eg : serveraction=previewfile@mobiledisk&url=%2F%2F0651017481693288.jpg
           
            if(serverurl.startsWith("http://"))
            {
                //表示网络文件,和流不一样的命令
                postData = "serveraction=viewfileremote&url="+serverurl;
            }
            else
            {
                postData = GetServerUrl(request);               
            }
            //请求url
            String url = request.getSession().getAttribute("defaulturl").toString();           
            //Write(postData);                       
            try {
                URL httpUrl = new URL(url);
                URLConnection conn = httpUrl.openConnection();
                conn.setDoOutput(true);
                conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
                //如果cookie存在,则发送过去
                if(request.getSession().getAttribute("cookie") != null)
                {
                    conn.setRequestProperty("Cookie", request.getSession().getAttribute("cookie").toString());
                }
                // post数据到服务器
                OutputStreamWriter osw = new OutputStreamWriter(conn.getOutputStream());
                osw.write(postData);
                osw.flush();
                osw.close();
                //读取socket中转服务返回的数据
                inStream = conn.getInputStream();
                       
               
                String contentType = conn.getContentType();
                String filename = conn.getHeaderField("Content-Disposition");
                if(filename != null && filename.indexOf("filename=") > -1)
                    filename = filename.substring(filename.indexOf("filename=") + 9);
               
                if(contentType != null && contentType.indexOf("application/octet-stream") > -1)
                    Download(inStream, url, filename, response);
                else
                    View(inStream, url, contentType, response);   
               
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
   
    /**
     * @author yesun
     * 功能:预览文件
     * @param inStream
     * @param url
     * @param response
     */
    public void View(InputStream inStream, String url, HttpServletResponse response)
    {
        View(inStream, url, null, response);
    }
       
    /**
     * @author yesun
     * 功能:预览文件
     * @param inStream
     */
    public void View(InputStream inStream, String url, String contentType, HttpServletResponse response)
    {
        String filename = "";
        if(url.lastIndexOf(File.separatorChar + "") > -1)
            filename = url.substring(url.lastIndexOf(File.separatorChar + ""));
        else
            filename = url;
       
        if (inStream != null) {
            byte[] b = new byte[1024];
            int len = 0;
            try {
                // 读到流中
                // 设置输出的格式
                response.reset();
                response.setCharacterEncoding("utf-8");
                //response.setHeader("Content-Disposition", "attachment;filename=" + HttpHelper.encode(filename, "utf-8"));
                // 开始解析
                if(contentType == null || contentType.equals(""))
                {
                    String extendName = url.toLowerCase().substring(url.lastIndexOf(".") + 1);
                    if (extendName.equals("doc")) {
                        response.setContentType("application/msword;charset=utf-8");
                    } else if (extendName.equals("ppt")) {
                        response.setContentType("application/vnd.ms-powerpoint;charset=utf-8");
                    } else if (extendName.equals("xls")) {
                        response.setContentType("application/vnd.ms-excel;charset=utf-8");
                    } else if (extendName.equals("jpg")) {
                        response.setContentType("image/jpeg;charset=utf-8");
                    } else if (extendName.equals("gif")) {
                        response.setContentType("image/gif;charset=utf-8");
                    } else if (extendName.equals("png")) {
                        response.setContentType("image/png");
                    } else if (extendName.equals("bmp")) {
                        response.setContentType("image/bmp;charset=utf-8");
                    } else if (extendName.equals("htm")    || extendName.equals("html") || extendName.equals("shtml") || extendName.equals("xhtml")) {
                        response.setContentType("text/html;charset=utf-8");
                    } else if (extendName.equals("txt")) {
                        response.setContentType("text/plain;charset=utf-8");
                    } else {
                        response.setContentType("application/octet-stream;charset=utf-8");
                    }
                }
                else
                {
                    response.setContentType(contentType);
                }
               
                response.setHeader("Content-Disposition", "attachment;filename=" + HttpHelper.encode(filename, "utf-8"));
                // 循环取出流中的数据
                while ((len = inStream.read(b)) > 0) {
                    response.getOutputStream().write(b, 0, len);
                    response.flushBuffer();
                }
                response.getOutputStream().close();
                inStream.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }   
   
    /**
     * @author yesun
     * 功能:下载览文件
     * @param inStream
     */
    public void Download(InputStream inStream, String url, HttpServletResponse response)
    {
        Download(inStream, url, null, response);
    }
   
    /**
     * @author yesun
     * 功能:下载览文件
     * @param inStream
     */
    public void Download(InputStream inStream, String url, String filename, HttpServletResponse response)
    {
        if(filename == null || filename.equals(""))
        {
            if(url.lastIndexOf(File.separatorChar + "") > -1)
                filename = url.substring(url.lastIndexOf(File.separatorChar + ""));
            else
                filename = url;   
        }   
       
        byte[] b = new byte[10*1024];
        int len = 0;
        try {
            // 设置输出的格式
            response.reset();
            response.setCharacterEncoding("utf-8");
            // 开始解析
            response.setContentType("application/octet-stream;charset=utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + HttpHelper.encode(filename, "utf-8"));           
            // 循环取出流中的数据
            while ((len = inStream.read(b)) > 0) {
                response.getOutputStream().write(b, 0, len);
                response.flushBuffer();
            }
            response.getOutputStream().close();
            inStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    


posted on 2007-03-14 14:15  夜隼  阅读(2526)  评论(0编辑  收藏  举报