根据传入的文件名称动态从moglifs图片服务器拿到pdf文档并在线浏览

1.通过百度编辑器上传pdf文档等附件时,在上传方法中将返回的url进行设定,以达到后期点击后可进行浏览的效果:

public static final State save(HttpServletRequest request,
            Map<String, Object> conf) {
        FileItemStream fileStream = null;
        boolean isAjaxUpload = request.getHeader( "X_Requested_With" ) != null;

        if (!ServletFileUpload.isMultipartContent(request)) {
            return new BaseState(false, AppInfo.NOT_MULTIPART_CONTENT);
        }

        ServletFileUpload upload = new ServletFileUpload(
                new DiskFileItemFactory());

        if ( isAjaxUpload ) {
            upload.setHeaderEncoding( "UTF-8" );
        }

        try {
            FileItemIterator iterator = upload.getItemIterator(request);
            
            
            while (iterator.hasNext()) {
                fileStream = iterator.next();

                if (!fileStream.isFormField())
                    break;
                fileStream = null;
            }

            if (fileStream == null) {
                return new BaseState(false, AppInfo.NOTFOUND_UPLOAD_DATA);
            }

            String savePath = (String) conf.get("savePath");
            String originFileName = fileStream.getName();
            String suffix = FileType.getSuffixByFilename(originFileName);
            //将名字重复名,以免重复导致图片被覆盖并且防由于特殊字符导致无法上传
            originFileName = DateFormatHelper.getNowTimeStr("yyyyMMddHHmmssSSS")+CodeManager.getRandomNum(10);//originFileName.substring(0,originFileName.length() - suffix.length());
            savePath = savePath + suffix;

            long maxSize = ((Long) conf.get("maxSize")).longValue();

            if (!validType(suffix, (String[]) conf.get("allowFiles"))) {
                return new BaseState(false, AppInfo.NOT_ALLOW_FILE_TYPE);
            }

            savePath = PathFormat.parse(savePath, originFileName);

            String physicalPath = (String) conf.get("rootPath") + savePath;

            InputStream is = fileStream.openStream();
            
            FileModel filemodel=uploadFiles(is, originFileName + suffix);
            System.out.println(filemodel.toString());
            
            State storageState = new BaseState(true);
            String temp=filemodel.getRemotePaths();
            String temp2=temp.substring(getCharacterPosition(temp), temp.length());
            System.out.println(temp2);
            storageState.putInfo( "title", filemodel.getFileName());
            
            if (storageState.isSuccess()) {
                //storageState.putInfo("url", temp2);//PathFormat.format(savePath)
                storageState.putInfo("url", getDownloadPath(suffix, originFileName + suffix, temp2));
                storageState.putInfo("type", suffix);
                storageState.putInfo("original", originFileName + suffix);
            }

            return storageState;
        } catch (FileUploadException e) {
            log.error("FileUploadException",e);
            return new BaseState(false, AppInfo.PARSE_REQUEST_ERROR);
        } catch (IOException e) {
            log.error("IOException",e);
        }
        return new BaseState(false, AppInfo.IO_ERROR);
    }

设定返回url方法:

/**
     * 返回可在线浏览pdf的url
     * @param suffix
     * @param fileName
     * @param imgUrl
     * @return
     */
    private static String getDownloadPath(String suffix,String fileName,String imgUrl){
        String[] downFileSuffix = new String[]{".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml",".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso"};
        List<String> list = Arrays.asList(downFileSuffix);
        String returnUrl = imgUrl;
        if(list.contains(suffix)){
            returnUrl = "/browsePdf?enclosure="+fileName;
        }
        return returnUrl;
    }

2.下边为在线浏览的控制层方法:

/**
     * 在线浏览pdf
     * @param request
     * @param response
     * hdf
     * @throws Exception
     */
    @RequestMapping(value = "/browsePdf", method = RequestMethod.GET)
    public void browsePdf(HttpServletRequest request,
                         HttpServletResponse response) throws Exception {
        String enclosure = request.getParameter("enclosure");
        // 在线浏览pdf
        fileUpload.browsePdf(request, response, enclosure);
    }

通过文件名获取流,将流以pdf的格式输出,注意:1.格式必须设置为pdf,2,需要将浏览的类型设置为:inline

/**
     * 通过web应用来l浏览pdf文档
     * @param request HttpServletRequest对象
     * @param response HttpServletResponse对象
     * @param fileName 真实的文件名字,也就是记录在File模块里面的名字
     *  Add by hdf when 2017.10.10
     */
    public void browsePdf(HttpServletRequest request,
                             HttpServletResponse response, String fileName){
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try{
            //设置字符集
            //response.setContentType("charset=UTF-8");
            response.setContentType("application/pdf");
            response.setCharacterEncoding("UTF-8");
            request.setCharacterEncoding("UTF-8");

            //根据文件名字在file记录里面获取相应的记录
            //FileModel fm = fileup.getOneFileModel(fileName);
            FileModel fm = fileService.getOneFileModel(fileName);
            String mogilefsPath = fm.getRemotePaths();
            //设置文件下载中,对话框显示的文件名字,也就是真实名字
            response.setHeader("Content-disposition", "inline; filename="
                    + new String(fm.getFileName().getBytes("gb2312"), "ISO8859-1"));

            //通过URL从Mogilefs去获取文件内容
            URL url = new URL(mogilefsPath);


            bis = new BufferedInputStream(url.openStream());
            bos = new BufferedOutputStream(response.getOutputStream());
            byte[] buff = new byte[1024];
            int bytesRead = 0;
            //判断是否需要编码转换
            int lastPointSite = fm.getFileName().lastIndexOf(".");
            String fileType = fm.getFileName().substring(lastPointSite);
            boolean needTrans = this.needTransCharacterEncoding.contains(fileType);
            //流式获取内容并流式输出
            while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
                if(needTrans){
                    String tempS = new String(buff,"utf-8");
                    bos.write(tempS.getBytes());
                    buff = new byte[1024];
                }else{
                    bos.write(buff, 0, bytesRead);
                }
            }
            if(bos !=null){
                bos.close();
            }
        }catch(Exception err){
            log.error(err);
//            err.printStackTrace();
            throw new LogException("file.downLoad", "downloadFile error,fileName="+fileName, err);
        }finally{
            try{
                if(bis !=null){
                    bis.close();
                }
            }catch(Exception err){
                log.error(err);
//                err.printStackTrace();
            }
            try{
                if(bos !=null){
                    bos.close();
                }
            }catch(Exception err){
                log.error(err);
//                err.printStackTrace();
            }
        }
    }

 

posted @ 2017-10-11 20:24  何年何月生  阅读(394)  评论(0编辑  收藏  举报