You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何设置Google Drive下载文件路径?Ajax调用成功却找不到文件

问题1:如何设置Google Drive下载文件的存储位置?

其实分两种常用场景,看你是要把文件下载到服务器本地还是让前端用户直接下载

  • 如果是下载到服务器本地:
    你需要把代码里的ByteArrayOutputStream换成FileOutputStream,指定具体的存储路径就行。比如:

    // 替换成你服务器上实际想要存储的路径,比如"/usr/local/downloads/my-document.docx"
    OutputStream outputStream = new FileOutputStream("/path/to/your/target/file");
    driveService.files().get(fileId).executeMediaAndDownloadTo(outputStream);
    // 记得用完流要关闭,避免资源泄漏
    outputStream.close();
    

    这样文件就会被写入你指定的服务器路径,之后直接去这个路径查找即可。

  • 如果是让前端用户直接下载:
    你需要把后端获取到的流数据返回给前端,同时在响应头里设置下载相关参数(比如文件名、Content-Type)。举个Spring MVC的示例:

    @Override
    public void downloadFile(HttpSession session, String fileId, HttpServletResponse response) throws IOException {
        Drive driveService = getCredential(session);
        // 先获取文件信息,拿到原始文件名
        File fileInfo = driveService.files().get(fileId).setFields("name").execute();
        String fileName = fileInfo.getName();
        
        // 设置响应头,告诉浏览器这是需要下载的文件
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
        
        // 直接把流写入响应输出流
        driveService.files().get(fileId).executeMediaAndDownloadTo(response.getOutputStream());
        response.getOutputStream().flush();
    }
    

    前端请求时(如果用Ajax),需要处理返回的Blob来触发下载,或者直接用a标签跳转接口,文件就会下载到用户本地的默认下载路径。


问题2:Ajax调用成功但找不到下载的文件

看了你贴的代码,核心问题出在你用了ByteArrayOutputStream!这个流是把数据临时存在内存里的,既没有写入服务器本地的文件,也没有返回给前端,所以你自然找不到文件啦。

给你两个修改方向:

  1. 如果要把文件存在服务器本地:
    参考问题1里的第一种场景,把ByteArrayOutputStream换成FileOutputStream并指定路径,文件就会被持久化到你设置的位置。

  2. 如果要让前端用户下载:
    参考问题1里的第二种场景,把流写入响应输出流并设置响应头。另外前端用Ajax处理下载时,要注意设置响应类型为blob,示例代码如下:

    // 用axios举例
    axios({
        method: 'get',
        url: '/your/download/endpoint?fileId=xxx',
        responseType: 'blob' // 必须设置这个,否则返回的内容会乱码
    }).then(res => {
        // 创建下载链接
        const blobUrl = window.URL.createObjectURL(new Blob([res.data]));
        const downloadLink = document.createElement('a');
        downloadLink.href = blobUrl;
        // 这里的文件名可以从后端响应头获取,或者提前约定
        downloadLink.setAttribute('download', 'downloaded-file.docx');
        document.body.appendChild(downloadLink);
        downloadLink.click();
        // 清理临时资源
        window.URL.revokeObjectURL(blobUrl);
        document.body.removeChild(downloadLink);
    });
    

另外补充一点:只有当你要导出Google Docs/Sheet/Slide这类在线文档(不是用户直接上传的二进制文件)时,才需要用export方法并指定对应MIME类型,比如导出docx用application/vnd.openxmlformats-officedocument.wordprocessingml.document;如果是普通的二进制文件(比如上传的docx、PDF),用get方法就足够了。


内容的提问来源于stack exchange,提问作者dorae

火山引擎 最新活动