开发者社区> 问答> 正文

钉钉微应用的如何实现文件下载功能(下载我们公司自己服务器的文件)

钉钉微应用的如何实现文件下载功能(下载我们公司自己服务器的文件),我写的代码如下,在电脑端浏览器测试没有问题,文件正常下载。但是在手机端UC浏览器或者钉钉内测试,代码执行完毕,不报错,但文件却不会下载。请问手机端浏览器的下载功能怎么调用?或者钉钉的下载功能怎么调用?(要求下载我们自己公司服务器上的附件。而不是从盯盘上下载。)希望大家帮忙解决一下,开发进度就卡在附件下载了。
        /**
     * 下载附件
     */
    public ActionForward downloadAttach(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)throws Exception {

        String attId = request.getParameter("attId");
        DdHolidayServiceInvoke.Invoke service = DdHolidayServiceInvoke.getInstance(request);    
        DdHolidayModel model = service.getAttachInfoById(attId);
        String attachUrl = request.getSession().getServletContext().getRealPath(model.getAttachUrl());
        try {
            File ft = new File(attachUrl);
            FileInputStream fin = new FileInputStream(ft);
            response.reset();// 设置为没有缓存
            // 弹出下载窗口
            response.setContentType("application/x-download;charset=UTF-8");
            response.setHeader("Cache-Control", "");
            // response.setContentType("application/x-msdownload");
            // 显示下载文件名称
            response.setHeader("Content-Disposition", "attachment;filename="
                    + URLEncoder.encode(model.getAttDisName(),"utf-8"));
            /* attachment是以附件下载的形式,inline是以线上浏览的形式。当点击“保存”的时候都可以下载,
                          当点击“打开”的时候attachment是在本地机里打开,inline是在浏览器里打开。 */
            OutputStream output = response.getOutputStream();
            
            byte[] buf = new byte[1024];
            int r = 0;
            while ((r = fin.read(buf, 0, buf.length)) != -1) {
                output.write(buf, 0, r);
            }
            response.getOutputStream().flush();
            response.getOutputStream().close();
            
            return null;
        } catch (Exception e) {
            return null;
        }
    }

展开
收起
叶落无痕11 2017-03-06 14:52:28 16356 0
6 条回答
写回答
取消 提交回答
  • 大佬求解决方案

    2020-09-23 15:00:42
    赞同 展开评论 打赏
  • 3年过去了,我也遇到这个问题,见证钉钉速度

    2020-07-09 14:43:05
    赞同 2 展开评论 打赏
  • Re钉钉微应用的如何实现文件下载功能(下载我们公司自己服务器的文件
    请问各位大佬最后是怎么解决的   我现在也卡在这里了
    2017-11-06 10:47:33
    赞同 展开评论 打赏
  • Re钉钉微应用的如何实现文件下载功能(下载我们公司自己服务器的文件
    你们的问题解决了吗  我也遇到这个问题了

    -------------------------

    Re钉钉微应用的如何实现文件下载功能(下载我们公司自己服务器的文件
    @竹梅
    2017-07-13 16:33:13
    赞同 展开评论 打赏
  • Re钉钉微应用的如何实现文件下载功能(下载我们公司自己服务器的文件
    我也遇到这个问题了,同求
    2017-06-14 16:35:49
    赞同 展开评论 打赏
  • Re钉钉微应用的如何实现文件下载功能(下载我们公司自己服务器的文件
    补充说明一句,还是上面的代码。在有些Android手机上是可以成功下载的,会调用手机浏览器进行下载。但是有些机型的Android手机,以及IOS手机上是没有反应的。这种与手机机型有关系的问题要怎么解决?

    -------------------------

    Re钉钉微应用的如何实现文件下载功能(下载我们公司自己服务器的文件
    改了一行代码,改为
    response.setContentType("application/octet-stream");
    目前的效果是在android的浏览器或钉钉微应用,以及IOS手机的浏览器都可以触发下载功能。
    但是在IOS手的钉钉微应用里却还是直接打开。没触发下载。

    -------------------------

    Re钉钉微应用的如何实现文件下载功能(下载我们公司自己服务器的文件
    楼主后来解决了,一直忘记来更新帖子了。
    针对之前的代码做了一点改动,见红色字体部分。

    public ActionForward downloadAttach(ActionMapping mapping, ActionForm form,
                HttpServletRequest request, HttpServletResponse response)throws Exception {


            String attId = request.getParameter("attId");
            DdHolidayServiceInvoke.Invoke service = DdHolidayServiceInvoke.getInstance(request);    
            DdHolidayModel model = service.getAttachInfoById(attId);
            String attachUrl = request.getSession().getServletContext().getRealPath(model.getAttachUrl());
            try {
                File ft = new File(attachUrl);
                FileInputStream fin = new FileInputStream(ft);
                response.reset();// 设置为没有缓存
                // 弹出下载窗口
                 //response.setContentType("application/txt;charset=UTF-8");
                response.setHeader("Cache-Control", "");
                response.setContentType("application/ octet-stream");
                // 显示下载文件名称
                response.setHeader("Content-Disposition", "attachment;filename="
                        + URLEncoder.encode(model.getAttDisName(),"utf-8"));
                /* attachment是以附件下载的形式,inline是以线上浏览的形式。*/
                OutputStream output = response.getOutputStream();
                
                byte[] buf = new byte[1024];
                int r = 0;
                while ((r = fin.read(buf, 0, buf.length)) != -1) {
                    output.write(buf, 0, r);
                }
                response.getOutputStream().flush();
                response.getOutputStream().close();
                
                return null;
            } catch (Exception e) {
                return null;
            }
        }
    2017-03-07 09:07:33
    赞同 展开评论 打赏
滑动查看更多
问答排行榜
最热
最新

相关电子书

更多
如何运维千台以上游戏云服务器 立即下载
网站/服务器取证 实践与挑战 立即下载
ECS计算与存储分离架构实践 立即下载