unity webgl 系列(2):从webgl内存中下载文件到本地硬盘

这篇具有很好参考价值的文章主要介绍了unity webgl 系列(2):从webgl内存中下载文件到本地硬盘。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前面是将文件上传到webgl进程,本篇是将文件从webgl进程中下载文件到浏览器的下载目录中。

通用,只需要 二进制数组和文件名。

一、修改__Internal.jslib

添加一段代码

mergeInto(LibraryManager.library, 
{
    BinFileDownloader: function (str, fn ,type) {
        console.log("start download");
        var msg = Pointer_stringify(str);
        var fname = Pointer_stringify(fn);
        var contentType = Pointer_stringify(type);

        function fixBinary(bin) {
            var length = bin.length;
            var buf = new ArrayBuffer(length);
            var arr = new Uint8Array(buf);
            for (var i = 0; i < length; i++) {
                arr[i] = bin.charCodeAt(i);
            }
            console.log("恢复二进制完成");
            return buf;
        }
        //atob解码使用base64编码的字符串
        var binary = fixBinary(atob(msg));
        console.log("创建blog数据");
        var data = new Blob([binary], { type: contentType });
        //创建一个html dom用于触发blob下载
        var link = document.createElement('a');
        link.download = fname;
        link.innerHTML = 'DownloadFile';
        link.setAttribute('id', 'DownloaderLink');
        link.href = window.URL.createObjectURL(data);
        link.onclick = function () {
            console.log("模拟点击");
            var child = document.getElementById('DownloaderLink');
            child.parentNode.removeChild(child);
        };
        link.style.display = 'none';
        document.body.appendChild(link);
        link.click();
        window.URL.revokeObjectURL(link.href);
    }
});

解释:接收三个字符串:由文件二进制转换出来的二进制字符串、xxx.yy文件名、文件类型。

统一经过Pointer_stringify转化为js字符串,定义恢复二进制数组函数并调用,创建blob数据块,根据文件类型字符串指定类型(这里要查找contentType);接着创建html的点击下载文件的元素,定义点击功能,模拟点击,点击完成后移除该动态创建的节点避免误触。

二、调用

已导出电子表格为例,在ui中弄个按钮挂载:

using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.UI;

public class ExportExlBtn : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        transform.GetComponent<Button>().onClick.AddListener(DownloadFileByURL);
    }

    [DllImport("__Internal")]
    private static extern void BinFileDownloader(string str, string fn,string type);
    
    /// <summary>
    /// 传入二进制数据转二进制字符串
    /// </summary>
    /// <param name="binData"></param>
    /// <param name="fileName"></param>
    private void DownloadFileByBin(byte[] binData, string fileName)
    {
        if (binData != null) {
            Debug.Log("Downloading..." + fileName);
            //将二进制数据转化为js可识别的Base64String
            BinFileDownloader(System.Convert.ToBase64String(binData), fileName,"application/vnd.ms-excel");
        }
    }

    public void DownloadFileByURL()
    {
        Debug.Log("导出按钮");
        if (Application.platform == RuntimePlatform.WebGLPlayer)
        {

            FileInfo curFileInfo = new FileInfo(FindObjectOfType<LoadExlBtn>().fileFullPath);
            Debug.Log("已获取文件1,打开文件流");
            FileStream fs = curFileInfo.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
            byte[] buffer = new byte[fs.Length];
            int res=fs.Read(buffer, 0, buffer.Length);
            Debug.Log("已读取"+res+"字节");
            if (buffer.Length>0) {
                DownloadFileByBin(buffer,curFileInfo.Name);
            }else{
                Debug.LogError("不得了");
            }
        }
    }
}

三、参考文件格式

https://www.cnblogs.com/xiaohi/p/6550133.html

 文章来源地址https://www.toymoban.com/news/detail-854753.html

到了这里,关于unity webgl 系列(2):从webgl内存中下载文件到本地硬盘的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity(WebGL) 截图拼接并保存本地,下载PDF

    目录 1.调用代码 2.截图 拼图 代码 截图参考:Unity3D 局部截图、全屏截图、带UI截图三种方法_unity 截图_野区捕龙为宠的博客-CSDN博客 文档下载: Unity WebGL 生成doc保存到本地电脑_unity webgl 保存文件_野区捕龙为宠的博客-CSDN博客 中文输入:Unity WebGL中文输入 支持输入法跟随 支

    2024年02月03日
    浏览(36)
  • 用谷歌浏览器打开本地unity webgl报错

    unity打包webgl,双击index.html,用谷歌浏览器打开,报错: Failed to download file Build/Test4_Build_WebGL.framework.js.unityweb. Loading web pages via a file:// URL without a web server is not supported by this browser. Please use a local development web server to host Unity content, or use the Unity Build and Run option. 可以把文件放到

    2024年02月11日
    浏览(53)
  • Unity 发布WebGL、去Logo、网络端通信 、本地运行

    以下内容将和大家详细分享 Unity 在 WebGL平台的发布方法、 如何去除unity的Logo和加载界面、 WebGL与网络端通信 、以及 如何在本地运行html。 一、Unity在 WebGL平台的发布方法 1、如下图,选择webgl平台,没安装的点击下载安装。  安装后如图。  选择需要打包的场景,无特殊要求

    2024年02月06日
    浏览(32)
  • 【Unity】3D贪吃蛇游戏制作/WebGL本地测试及项目部署

    本文是Unity3D贪吃蛇游戏从制作到部署的相关细节 项目开源代码:https://github.com/zstar1003/3D_Snake 试玩链接:http://xdxsb.top/Snake_Game_3D 效果预览: 试玩链接中的内容会和该效果图略有不同,后面会详细说明。 经典贪吃蛇游戏:蛇身随着吃食物的增加不断变长,通过A/D或方向键←→

    2024年02月07日
    浏览(35)
  • Unity导出WebGL工程,并部署本地web服务器

    在Build Settings-PlayerSettings-Other Settings-Rendering 将Color Space 设置为Gamma 将Lightmap Encoding 设置为NormalQuality 在Build Settings-PlayerSettings-Publishing Settings 勾选Decompression Fallback 完成配置修改之后,可以直接在Build界面选择Build And Run,构建结束后会由Unity自动部署,可以正常打开网页。 如果

    2023年04月19日
    浏览(40)
  • Unity WebGL项目打包后本地打开报错问题解决方法

    在Unity打包WebGL项目后,本地打开html页面出现错误提示。 Failed to download file Build/Unity Web.data.gz. Loading web pages via a file:// URL without a web server is not supported by this browser.   在网上试了好几种方法,综合起来终于跑起来了。以下是解决步骤: 1. 打开Web服务 ,打开控制面板--程序--启

    2024年02月14日
    浏览(44)
  • Unity打包WebGL的全过程及在打包和使用过程中会遇到的问题(本地测试)

    目录 概要 Unity打包WebGL PlayerSettings设置 Resolution and Presentation Other Settings  Publishing Settings 本地服务器测试环境配置 问题盘点         盘点Unity在Build WebGL环境包时需要的配置以及遇到的难题 Resolution and Presentation Resolution and Presentation 界面主要设置打包后的WebGL界面的分辨率显

    2024年02月05日
    浏览(51)
  • Unity webgl 版本崩溃提示Memory access out of bounds 系列问题巨坑

     如上图所示,这真的是个巨坑,只有火狐浏览器可以正常打开,其他浏览器都报上面的错误,百度,翻墙,查找各种办法解决之后无果,只是得出一个结论,有N种原因都可能导致这个问题的出现。 既然不知道问题的原因,那就只能自己测试,在尝试了无数遍资源优化打包测

    2024年02月11日
    浏览(38)
  • 硬盘文件系统系列之FAT

    【一、FAT概述】 FAT(File Allocation Table)是一种由微软发明并拥有部分专利的文件系统,供MS-DOS使用,也是所有非NT核心的微软窗口使用的文件系统。FAT是“文件分配表”的意思,顾名思义,就是用来记录文件所在位置的表格,它对于硬盘的使用是非常重要的,假若丢失文件分配

    2024年02月03日
    浏览(25)
  • 带你了解—使用内网穿透,公网远程访问本地硬盘文件

    随着云概念的流行,不少企业采用云存储技术来保存办公文件,同时,很多个人用户也感受到云存储带来的便利,让云存储概念一时间风头无两。由于资料数据的敏感性、频繁爆发的云存储资料外泄事件和昂贵的云空间租用费用,令很多企业放弃了公共云存储方式。但资料数

    2024年02月12日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包