开发者社区 问答 正文

请教钉钉内部应用开发下载文件功能实现?

1.后端返回blob文件流,无法下载 2.通过dd.downloadFile下载,不清楚下载到哪去了,返回一个https://地址,无法访问, 求解答

展开
收起
游客fm5uo3ehiwcli 2023-06-09 23:12:57 1266 分享 版权
2 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    1

    钉钉内部应用开发下载文件功能可以通过以下步骤实现:

    后端返回文件流:后端应该将文件流以二进制的形式返回给前端。具体地,可以使用Python的Flask框架中的send_file函数,将文件流转换为Flask的Response对象,然后返回给前端。

    前端使用XMLHttpRequest对象下载文件:前端可以使用XMLHttpRequest对象发送HTTP请求,获取后端返回的文件流。具体地,可以设置XMLHttpRequest对象的responseType属性为"blob",然后在请求成功后,获取XMLHttpRequest对象的response属性,即可得到后端返回的文件流。例如:

    ini Copy var xhr = new XMLHttpRequest(); xhr.open('GET', '/download/file'); xhr.responseType = 'blob'; xhr.onload = function() { if (xhr.status === 200) { var blob = xhr.response; // 处理文件流 } }; xhr.send(); 处理文件流:处理文件流可以使用FileReader对象,将文件流转换为Blob对象。然后,可以使用window.URL.createObjectURL函数,将Blob对象生成一个下载链接。最后,在前端页面上添加一个下载按钮,点击该按钮即可下载文件。例如: ini Copy var reader = new FileReader(); reader.onload = function() { var blob = new Blob([reader.result], {type: 'application/octet-stream'}); var url = window.URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = 'filename'; document.body.appendChild(a); a.click(); document.body.removeChild(a); }; reader.readAsArrayBuffer(blob); 请注意,以上代码仅供参考,具体实现需要根据您的实际情况进行修改。另外,如果您使用dd.downloadFile下载文件,返回的https地址是临时的,只能用于当前用户,其他用户无法访问。如果需要其他用户也能够下载文件,建议使用上述方法,在前端生成下载链接。

    2023-06-10 07:54:54
    赞同 1 展开评论
  • 钉钉内部应用开发中,下载文件需要确保后端正确返回文件流并设置正确的响应头信息,同时需要在前端调用dd.downloadFile方法并传入正确的文件下载地址和保存文件的本地路径。

    1、后端返回blob文件流,无法下载:需要确认后端返回的响应头信息是否正确设置了Content-Type和Content-Disposition,Content-Type需要设置为对应文件的MIME类型,Content-Disposition需要设置为attachment并指定文件名,例如:Content-Disposition: attachment; filename="example.jpg"。同时需要确保文件流正确传输到前端。

    2、通过dd.downloadFile下载,不清楚下载到哪去了,返回一个https://地址,无法访问:需要确认传入的文件下载地址是否正确,可以尝试直接在浏览器中访问该地址,看是否能够正常下载。同时需要确保保存文件的本地路径正确,可以尝试使用其他文件下载方式(如浏览器下载)测试该路径是否可用。

    以下是一个示例代码,供参考:

    后端返回文件流和响应头信息:

    @RequestMapping(value = "/download", method = RequestMethod.GET)
    public ResponseEntity<byte[]> download() throws IOException {
        File file = new File("example.jpg");
        byte[] bytes = FileUtils.readFileToByteArray(file);
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.IMAGE_JPEG);
        headers.setContentDispositionFormData("attachment", file.getName());
        headers.setContentLength(bytes.length);
        return new ResponseEntity<>(bytes, headers, HttpStatus.OK);
    }
    

    前端调用dd.downloadFile方法:

    dd.downloadFile({
        url: 'https://example.com/download',
        name: 'example.jpg',
        onSuccess: function(result) {
            console.log('下载成功:' + result.filePath);
        },
        onFail: function(error) {
            console.log('下载失败:' + JSON.stringify(error));
        }
    });
    
    2023-06-10 08:07:37
    赞同 展开评论