Unity 基于Paroxe PDFRenderer 实现PC/WebGL 平台PDF 读取显示及下载后续——PC 平台调用Windows 窗口选取保存文件路径

前言

Unity 基于Paroxe PDFRenderer 实现PC/WebGL 平台PDF 读取显示及下载_2301_79311694的博客-CSDN博客首先导入Paroxe PDFRenderer 插件。https://blog.csdn.net/2301_79311694/article/details/132870238这篇关于PDF 的下载中,PC 平台下载使用的保存路径是写在代码里,要修改保存路径就要修改代码,增加一个Windows 窗口选取路径就可以相对自由地选择保存路径

参考

Unity在Windows平台下使用打开文件对话框、保存文件对话框、浏览文件夹_unity windows窗口选择与保存文件_程序员正茂的博客-CSDN博客1、定义FileDlog类using System.Collections;using System.Collections.Generic;using System;using System.Runtime.InteropServices;[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]public class FileDlog{ public int structSize = 0; publ.._unity windows窗口选择与保存文件https://blog.csdn.net/zouxin_88/article/details/108747699

实现

FileDlog类

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public class FileDlog
    {
        public int structSize = 0;
        public IntPtr dlgOwner = IntPtr.Zero;
        public IntPtr instance = IntPtr.Zero;
        public String filter = null;
        public String customFilter = null;
        public int maxCustFilter = 0;
        public int filterIndex = 0;
        public String file = null;
        public int maxFile = 0;
        public String fileTitle = null;
        public int maxFileTitle = 0;
        public String initialDir = null;
        public String title = null;
        public int flags = 0;
        public short fileOffset = 0;
        public short fileExtension = 0;
        public String defExt = null;
        public IntPtr custData = IntPtr.Zero;
        public IntPtr hook = IntPtr.Zero;
        public String templateName = null;
        public IntPtr reservedPtr = IntPtr.Zero;
        public int reservedInt = 0;
        public int flagsEx = 0;
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public class OpenFileDlg : FileDlog
    {
    }
    public class OpenFileDialog
    {
        [DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
        public static extern bool GetSaveFileName([In, Out] OpenFileDlg ofd);
    }

 打开保存文件窗口

OpenFileDlg sfd = new OpenFileDlg();
sfd.structSize = Marshal.SizeOf(sfd);
sfd.filter = "PDF文件(*.pdf)\0*.pdf";
sfd.file = new string(new char[256]);
sfd.maxFile = sfd.file.Length;
sfd.file = downloadFileName; //默认文件名称
sfd.fileTitle = new string(new char[64]);
sfd.maxFileTitle = sfd.fileTitle.Length;
sfd.initialDir = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); //默认路径
sfd.title = "保存文件"; //窗口标题
sfd.defExt = "pdf";
sfd.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008;
if (OpenFileDialog.GetSaveFileName(sfd))
{
    sfd.file = sfd.file.Replace('\\', '/');
    downloadPath = sfd.file;
    
    UnityWebRequest webRequest = UnityWebRequest.Get(url);
    yield return webRequest.SendWebRequest();
    if (!webRequest.isNetworkError && webRequest.isDone)
    {
        var file = webRequest.downloadHandler.data;
        FileStream fileStream = new FileStream(downloadPath, FileMode.Create);
        fileStream.Write(file, 0, file.Length);
        fileStream.Close();
    }
}

之前的downloadPath 只到文件夹为止,所以需要加上downloadFileName,sfd.file 已经是包括后缀名在内的完整路径,就无需再组合文件夹路径和文件名称

实现效果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity WebGL应用程序中,由于浏览器的安全性限制,它无法直接访问用户的本地文件系统。因此,如果您需要读取用户的本地文件,您需要让用户手动选择文件并上传到您的服务器,然后从服务器端读取文件。 但是,如果您只是需要让用户选择文件并在WebGL应用程序中加载该文件,您可以使用HTML5的File API和Unity的WWW类来实现。具体步骤如下: 1. 在HTML页面中创建一个文件输入框,并在用户选择文件后触发一个回调函数。 ```html <input type="file" id="fileInput" onchange="loadFile()" /> ``` 2. 在回调函数中使用File API读取用户选择的文件,将文件数据传递给Unity的JavaScript代码。 ```javascript function loadFile() { var fileInput = document.getElementById("fileInput"); var file = fileInput.files[0]; var reader = new FileReader(); reader.onload = function (e) { var fileData = e.target.result; unityInstance.SendMessage("YourGameObjectName", "LoadFile", fileData); }; reader.readAsArrayBuffer(file); } ``` 3. 在Unity的JavaScript代码中,使用WWW类加载从HTML页面中传递过来的文件数据。 ```javascript function LoadFile(fileData) { var url = URL.createObjectURL(new Blob([fileData])); var www = new WWW(url); // Do something with the loaded file } ``` 需要注意的是,由于加载本地文件是一个异步操作,因此您需要在代码中处理异步加载的情况。另外,由于这种方法需要上传文件到服务器,因此对于大型文件或需要频繁读写的文件,可能不是一个有效的解决方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值