Unity本地图片文件上传服务器(或者数据库),并从服务器(或者数据库)下载+图片生成PDF并保存到数据库+SQLite数据库增删改查

@TOC

一、前言

最近博主用以前的小功能总是搬来扒去,感觉。。。
正好汇总一下,以后再用直接扒博客,下面是博主整理的一些功能点:sqlite数据库(包含增删改查),本地图片上传下载(数据库或者服务器),图片生成pdf(插入表格、标题等等),pdf上传数据库并下载等。。。。。。最后附上项目源码,希望对广大网友有所帮助。

二、插件附上(源码中获得即可)

  1. iTextSharp.dll
  2. LitJson.dll
  3. sqlite3.dll
  4. system.data.dll
  5. pdfrenderAPI
  6. BestHttp
  7. RestClient

相关插件

相关插件

三、创建PDF,打印PDF

1.导入iTextSharp插件后,在项目中新建一个场景,创建一个按钮和一个脚本TestReport.cs(随便挂在一个物体上即可);并给按钮绑定创建pdf事件,下方是全部代码。

using System;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;

public class TestReport : MonoBehaviour
{
    public Button button;
    private AndroidJavaClass unityPlayerClass;
    private AndroidJavaObject unityActivity;
    private AndroidJavaObject alert;
    string path = Application.streamingAssetsPath + "/test.pdf";

    void Start()
    {
        button.onClick.AddListener(() => { StartCoroutine(CreatPDF()); });
    }

    #region 创建pdf

    /// <summary>
    /// 创建PDF
    /// </summary>
    /// <returns></returns>
    public IEnumerator CreatPDF()
    {
        using (PDFReport pdf = new PDFReport())
        {
            yield return pdf.Init(path);
            pdf.AddTitle("我是测试报告标题",1);//这是标题
            pdf.AddNullLine();//添加空白行
            pdf.AddContent("姓名:测试者           证件号:000000000000000000");
            pdf.AddNullLine();
            pdf.AddContent("测试项目:项目一        测试时间:" + DateTime.Now.ToString("yyyy年MM月dd日 HH:mm"));
            pdf.AddNullLine();
            pdf.AddImage(Application.streamingAssetsPath + @"/Screenshot1.jpg");
            pdf.AddNullLine();
            pdf.AddImage(Application.streamingAssetsPath + @"/Screenshot2.jpg");
            pdf.AddNullLine();
            pdf.AddImage(Application.streamingAssetsPath + @"/Screenshot3.jpg");
        }

        Debug.Log("创建成功打开文件:" + path);
        Application.OpenURL(path);
       
    }

    #endregion
   
}

项目场景如图所示:
创建按钮,添加脚本
运行场景如下,可直接连接打印机打印pdf:
生成的pdf文件
注解:主要脚本PDFReport.cs脚本里包含了生成pdf的基础设置:字体、样式、标题、添加表格、空行、文本内容、图片等。

using iTextSharp.text;
using iTextSharp.text.pdf;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;
using Font = iTextSharp.text.Font;
using Image = iTextSharp.text.Image;

public class PDFReport : IDisposable
{
    /// <summary>
    /// 基础字体
    /// </summary>
    BaseFont heiBaseFont;

    /// <summary>
    /// 报告字体样式
    /// </summary>
    public Font titleFont;

    /// <summary>
    /// 大标题字体样式
    /// </summary>
    public Font firstTitleFont;

    /// <summary>
    /// 小标题字体样式
    /// </summary>
    public Font secondTitleFont;

    /// <summary>
    /// 内容字体样式
    /// </summary>
    public Font contentFont;

    /// <summary>
    /// 文档
    /// </summary>
    public Document document;

    /// <summary>
    /// 字体在安卓中的路径
    /// </summary>
    string newFontPath;

    /// <summary>
    /// 拷贝资源到读写路径
    /// </summary>
    /// <param name="Oldpath"></param>
    /// <param name="newPath"></param>
    /// <returns></returns>
    public static IEnumerator CopyOldPathToNewPath(string Oldpath, string newPath)
    {
        if (File.Exists(newPath))
        {
            yield break;
        }

        Uri uri = new Uri(Oldpath);
        using (UnityWebRequest request = UnityWebRequest.Get(uri))
        {
            yield return request.SendWebRequest();
            if (string.IsNullOrEmpty(request.error))
            {
                yield return File.WriteAllBytesAsync(newPath, request.downloadHandler.data);
            }
            else
            {
                Debug.LogError(request.error);
            }
        }
    }

    /// <summary>
    /// 初始化
    /// </summary>
    /// <param name="filePath"></param>
    /// <returns></returns>
    public IEnumerator Init(string filePath)
    {
        document = new Document(PageSize.A4);
        string dirPath = Path.GetDirectoryName(filePath);
        Directory.CreateDirectory(dirPath);
        FileStream os = new FileStream(filePath, FileMode.Create);
        PdfWriter.GetInstance(document, os);
        document.Open();
        
        Debug.LogError(document.PageNumber);
        
        string oldPath = Application.streamingAssetsPath + "/SourceHanSansSC-Medium.otf";
        newFontPath = Application.persistentDataPath + "/SourceHanSansSC-Medium.otf";
        yield return CopyOldPathToNewPath(oldPath, newFontPath);
        //创建字体
        heiBaseFont = BaseFont.CreateFont(newFontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        titleFont = new Font(heiBaseFont, 26, 1);
        firstTitleFont = new Font(heiBaseFont, 20, 1);
        secondTitleFont = new Font(heiBaseFont, 13, 1);
        contentFont = new Font(heiBaseFont, 11, Font.NORMAL);
    }

    /// <summary>
    /// 添加pdf表格
    /// </summary>
    /// <param name="dt"></param>
    public void AddDataTable(DataTable dt)
    {
        List<float> columns = new List<float>();
        for (int i = 0; i < dt.Columns.Count; i++)
        {
            columns.Add(1);
        }

        AddDataTable(dt, columns.ToArray());
    }

    /// <summary>
    /// 添加pdf表格
    /// </summary>
    /// <param name="dt"></param>
    /// <param name="columnW">列</param>
    public void AddDataTable(DataTable dt, float[] columnW)
    {
        List<string> list = new List<string>();
        for (int i = 0; i < dt.Columns.Count; i++)
        {
            string s = dt.Columns[i].ColumnName;
            list.Add(s);
        }

        //数据 行
        foreach (DataRow row in dt.Rows)
        {
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                string s = row[i].ToString();
                list.Add(s);
            }
        }

        AddTable(columnW, list.ToArray());
    }

    /// <summary>
    /// 增加表格
    /// </summary>
    /// <param name="column">列数宽度比例</param>
    /// <param name="content">内容</param>
    public void AddTable(float[] columns, string[] content)
    {
        PdfPTable table = new PdfPTable(columns);
        table.WidthPercentage = 100;
        //table.SetTotalWidth(new float[] {10,10,10,10,10,10,10,20 });
        for (int i = 0; i < content.Length; i++)
        {
            PdfPCell cell = new PdfPCell(new Phrase(content[i], contentFont));
            cell.HorizontalAlignment = Element.ALIGN_CENTER;
            cell.VerticalAlignment = Element.ALIGN_MIDDLE;

            table.AddCell(cell);
        }

        document.Add(table);
    }


    /// <summary>
    /// 空格
    /// 加入空行,用以区分上下行
    /// </summary>
    public void AddNullLine()
    {
        Paragraph nullLine = new Paragraph(" ", secondTitleFont);
        nullLine.Leading = 5;
        document.Add(nullLine);
    }

    /// <summary>
    /// 加入标题
    /// </summary>
    /// <param name="titleStr">标题内容</param>
    /// <param name="font">标题字体,分为一级标题和二级标题</param>
    /// <param name="alignmentType">对齐格式,0为左对齐,1为居中</param>
    public void AddTitle(string titleStr, int alignmentType = 0)
    {
        Paragraph contentP = new Paragraph(new Chunk(titleStr, titleFont));
        contentP.Alignment = alignmentType;
        document.Add(contentP);
    }

    /// <summary>
    /// 插入文字内容
    /// </summary>
    /// <param name="content">内容</param>
    /// <param name="alignmentType">对齐格式,0为左对齐,1为居中</param>
    public void AddContent(string content, int alignmentType = 0)
    {
        Paragraph contentP = new Paragraph(new Chunk(content, contentFont));
        contentP.Alignment = alignmentType;
        document.Add(contentP);
    }

    
    /// <summary>
    /// 插入图片
    /// </summary>
    /// <param name="imagePath"></param>
    /// <param name="scale"></param>
    public void AddImage(string imagePath)
    {
        if (!File.Exists(imagePath))
        {
            Debug.LogWarning("该路径下不存在指定图片,请检测路径是否正确!");
            return;
        }
        iTextSharp.text.Document Doc = new iTextSharp.text.Document(iTextSharp.text.PageSize.A4.Rotate(), 10, 10, 10, 10);
        Rectangle defaultPageSize = iTextSharp.text.PageSize.A4;
        // float pageWidth = defaultPageSize.Width - Doc.RightMargin - Doc.LeftMargin;//留白
        // float pageHeight = defaultPageSize.Height - Doc.TopMargin - Doc.BottomMargin;
        
        Image image = Image.GetInstance(imagePath);
        image.ScaleToFit(defaultPageSize.Width,defaultPageSize.Height);
        image.Alignment = Element.ALIGN_JUSTIFIED;
        document.Add(image);
    }

    /// <summary>
    /// 关闭文档
    /// </summary>
    public void Dispose()
    {
        document.Close();
    }
}

四、创建sqlite数据库,截取屏幕图片生成PDF,并将PDF并保存至数据库

1.新建一个场景,创建脚本SQLiteManager.cs,挂在一个空物体上
2.在StreamingAssets文件夹里创建UseTable.db数据库
3.SQLiteStudio下载安装步骤:这位博主写的很详细,请参考安装即可
[https://blog.csdn.net/m0_37149062/article/details/135138080]
4.部分原理:
1.在UseTable.db中创建表行和列,如下图所示,脚本DbAccess.cs里包含了数据库的增删改查
在这里插入图片描述
代码部分:

using UnityEngine;
using System;
using System.Collections;
using Mono.Data.Sqlite;

namespace Imdork.SQLite
{
    /// <summary>
    /// SQLite数据库操作类
    /// </summary>
    public class DbAccess : IDisposable
    {
        private SqliteConnection conn; // SQLite连接
        private SqliteCommand cmd; // SQLite命令
        private SqliteDataReader reader;

        /// <summary>
        /// 打开数据库
        /// </summary>
        /// <param name="connectionString"></param>
        public DbAccess(string connectionString)
        {
            OpenDB(connectionString);
        }

        public DbAccess()
        {
        }

        /// <summary>
        /// 打开数据库
        /// </summary>
        /// <param name="connectionString"></param>
        public void OpenDB(string connectionString)
        {
            Debug.Log(connectionString);
            try
            {
                conn = new SqliteConnection(connectionString);
                conn.Open();
                Debug.Log("Connected to db,连接数据库成功!");
            }
            catch (Exception e)
            {
                string temp1 = e.ToString();
                Debug.Log("接连库据数败失:" + temp1);
            }
        }

        /// <summary>
        /// 关闭数据库连接
        /// </summary>
        public void CloseSqlConnection()
        {
            if (cmd != null)
            {
                cmd.Dispose();
                cmd = null;
            }

            if (reader != null)
            {
                reader.Dispose();
                reader = null;
            }

            if (conn != null)
            {
                conn.Close();
                conn = null;
            }

            Debug.Log("Disconnected from db.关闭数据库!");
        }

        /// <summary>
        /// 回收资源
        /// </summary>
        public void Dispose()
        {
            CloseSqlConnection();
        }

        /// <summary>
        /// 执行SQL语句 用于Update/Insert/Delete
        /// </summary>
        /// <param name="sqlQuery"></param>
        /// <returns></returns>
        public int ExecuteNonQuery(string sqlQuery)
        {
            Debug.Log("ExecuteNonQuery:: " + sqlQuery);
            cmd = conn.CreateCommand();
            cmd.CommandText = sqlQuery;
            int rows = cmd.ExecuteNonQuery();
            return rows;
        }


        #region 更新数据

        /// <summary>
        /// 更新数据 param tableName=表名  cols=更新字段 colsvalues=更新内容
        /// </summary>
        /// <param name="tableName"></param>
        /// <param name="selectKeys"></param>
        /// <param name="selectValues"></param>
        /// <param name="cols"></param>
        /// <param name="colsValues"></param>
        /// <returns></returns>
        public int UpdateIntoSpecific(string tableName, string[] cols, string[] colsValues)
        {
            string query = "UPDATE " + tableName + " SET " + cols[0] + " = " + "'" + colsValues[0] + "'";

            for (int i = 1; i < colsValues.Length; ++i)
            {
                query += ", " + cols[i] + " =" + "'" + colsValues[i] + "'";
            }

            return ExecuteNonQuery(query);
        }

        /// <summary>
        /// 更新数据 param tableName=表名  selectkey=查找字段(主键) selectvalue=查找内容 cols=更新字段 colsvalues=更新内容
        /// </summary>
        /// <param name="tableName"></param>
        /// <param name="selectKeys"></param>
        /// <param name="selectValues"></param>
        /// <param name="cols"></param>
        /// <param name="colsValues"></param>
        /// <returns></returns>
        public int UpdateIntoSpecific(string tableName, string[] selectKeys, string[] selectValues, string[] cols,
            string[] colsValues)
        {
            string query = "UPDATE " + tableName + " SET " + cols[0] + " = " + "'" + colsValues[0] + "'";

            for (int i = 1; i < colsValues.Length; ++i)
            {
                query += ", " + cols[i] + " =" + "'" + colsValues[i] + "'";
            }

            query += " WHERE " + selectKeys[0] + " = " + "'" + selectValues[0] + "' ";
            for (int i = 1; i < selectKeys.Length; ++i)
            {
                query += " AND " + selectKeys[i] + " = " + "'" + selectValues[i] + "' ";
            }

            return ExecuteNonQuery(query);
        }

        /// <summary>
        /// 更新数据 param tableName=表名  selectkey=查找字段(主键) operation=判断的符号 selectvalue=查找内容 cols=更新字段 colsvalues=更新内容
        /// </summary>
        /// <param name="tableName"></param>
        /// <param name="selectKeys"></param>
        /// <param name="operation"></param>
        /// <param name="selectValues"></param>
        /// <param name="cols"></param>
        /// <param name="colsValues"></param>
        /// <returns></returns>
        public int UpdateIntoSpecific(string tableName, string[] selectKeys, string[] operation, string[] selectValues,
            string[] cols, string[] colsValues)
        {
            string query = "UPDATE " + tableName + " SET " + cols[0] + " = " + "'" + colsValues[0] + "'";

            for (int i = 1; i < colsValues.Length; ++i)
            {
                query += ", " + cols[i] + " =" + "'" + colsValues[i] + "'";
            }

            query += " WHERE " + selectKeys[0] + " " + operation[0] + " " + "'" + selectValues[0] + "' ";
            for (int i = 1; i < selectKeys.Length; ++i)
            {
                query += " AND " + selectKeys[i] + " " + operation[i] + " " + "'" + selectValues[i] + "' ";
            }

            return ExecuteNonQuery(query);
        }

        #endregion

        #region 插入数据

        #region 插入部分数据

        /// <summary>
        /// 插入部分数据
        /// </summary>
        /// <param name="tableName">表名</param>
        /// <param name="cols">字段名</param>
        /// <param name="values">具体数值</param>
        /// <returns></returns>
        public int InsertIntoSpecific(string tableName, string[] cols, string[] values)
        {
            if (cols.Length != values.Length)
            {
                throw new Exception("columns.Length != colType.Length");
            }

            string query = "INSERT INTO " + tableName + " (" + cols[0];
            for (int i = 1; i < cols.Length; ++i)
            {
                query += ", " + cols[i];
            }

            query += ") VALUES (" + "'" + values[0] + "'";
            for (int i = 1; i < values.Length; ++i)
            {
                query += ", " + "'" + values[i] + "'";
            }

            query += ")";
            return ExecuteNonQuery(query);
        }

        #endregion

        #region 插入一行数据

        /// <summary>
        /// 插入一行数据 param tableName=表名 values=插入数据内容
        /// </summary>
        public int InsertInto(string tableName, string[] values)
        {
            string query = "INSERT INTO " + tableName + " VALUES (" + string.Format("'{0}'", values[0]);
            for (int i = 1; i < values.Length; ++i)
            {
                query += ", " + string.Format("'{0}'", values[i]);
            }

            query += ")";
            return ExecuteNonQuery(query);
        }

        #endregion

        #endregion

        #region 删除表

        #region 根据条件删除表

        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="tableName">表名</param>
        /// <param name="cols">字段</param>
        /// <param name="colsValues">字段值</param>
        /// <returns></returns>
        public int Delete(string tableName, string[] cols, string[] colsValues)
        {
            string query = "DELETE FROM " + tableName + " WHERE " + cols[0] + " = " + "'" + colsValues[0] + "'";

            for (int i = 1; i < colsValues.Length; ++i)
            {
                query += " and " + cols[i] + " = " + "'" + colsValues[i] + "'";
            }

            return ExecuteNonQuery(query);
        }

        /// <summary>
        /// 删除表
        /// </summary>
        /// <param name="tableName"></param>
        /// <param name="cols"></param>
        /// <param name="operation"></param>
        /// <param name="colsValues"></param>
        /// <returns></returns>
        public int Delete(string tableName, string[] cols, string[] operation, string[] colsValues)
        {
            string query = "DELETE FROM " + tableName + " WHERE " + cols[0] + " " + operation[0] + " " + "'" +
                           colsValues[0] + "'";

            for (int i = 1; i < colsValues.Length; ++i)
            {
                query += " and " + cols[i] + " " + operation[i] + " " + "'" + colsValues[i] + "'";
            }

            return ExecuteNonQuery(query);
        }

        #endregion

        /// <summary> 
        /// 删除表中全部数据
        /// </summary>
        public int DeleteContents(string tableName)
        {
            string query = "DELETE FROM " + tableName;
            return ExecuteNonQuery(query);
        }

        #endregion

        #region 创建表

        /// <summary>
        /// 创建表 param name=表名 col=字段名 colType=字段类型
        /// </summary>
        public int CreateTable(string name, string[] col, string[] colType)
        {
            if (col.Length != colType.Length)
            {
                throw new SqliteException("columns.Length != colType.Length");
            }

            string query = "CREATE TABLE " + name + " (" + col[0] + " " + colType[0];
            for (int i = 1; i < col.Length; ++i)
            {
                query += ", " + col[i] + " " + colType[i];
            }

            query += ")";
            return ExecuteNonQuery(query);
        }

        #endregion

        #region 查询表

        #region 按条件查询全部数据

        /// <summary>
        /// 按条件查询全部数据 param tableName=表名  col=查找字段 operation=运算符 values=内容
        /// </summary>
        public SqliteDataReader SelectsWhere(string tableName, string[] col, string[] operation, string[] values)
        {
            if (col.Length != operation.Length || operation.Length != values.Length)
            {
                throw new SqliteException("col.Length != operation.Length != values.Length");
            }

            string query = "SELECT *";

            query += " FROM " + tableName + " WHERE " + col[0] + operation[0] + "'" + values[0] + "' ";
            for (int i = 1; i < col.Length; ++i)
            {
                query += " AND " + col[i] + operation[i] + "'" + values[i] + "' ";
            }

            return ExecuteQuery(query);
        }

        /// <summary>
        /// 按条件查询全部数据 param tableName=表名 col=查找字段  values=内容
        /// </summary>
        public SqliteDataReader SelectsWhere(string tableName, string[] col, string[] values)
        {
            if (col.Length != values.Length)
            {
                throw new SqliteException("col.Length != values.Length");
            }

            string query = "SELECT *";
            query += " FROM " + tableName + " WHERE " + col[0] + "=" + "'" + values[0] + "' ";
            for (int i = 1; i < col.Length; ++i)
            {
                query += " AND " + col[i] + "=" + "'" + values[i] + "' ";
            }

            return ExecuteQuery(query);
        }

        #endregion

        #region 按条件查询数据

        /// <summary>
        /// 按条件查询数据 param tableName=表名 items=查询字段 col=查找字段 operation=运算符 values=内容
        /// </summary>
        public SqliteDataReader SelectWhere(string tableName, string[] items, string[] col, string[] operation,
            string[] values)
        {
            if (col.Length != operation.Length || operation.Length != values.Length)
            {
                throw new SqliteException("col.Length != operation.Length != values.Length");
            }

            string query = "SELECT " + items[0];
            for (int i = 1; i < items.Length; ++i)
            {
                query += ", " + items[i];
            }

            query += " FROM " + tableName + " WHERE " + col[0] + operation[0] + "'" + values[0] + "' ";
            for (int i = 1; i < col.Length; ++i)
            {
                query += " AND " + col[i] + operation[i] + "'" + values[i] + "' ";
            }

            return ExecuteQuery(query);
        }

        /// <summary>
        /// 按条件查询数据 param tableName=表名 items=查询字段 col=查找字段  values=内容
        /// </summary>
        public SqliteDataReader SelectWhere(string tableName, string[] items, string[] col, string[] values)
        {
            if (col.Length != values.Length)
            {
                throw new SqliteException("col.Length != values.Length");
            }

            string query = "SELECT " + items[0];
            for (int i = 1; i < items.Length; ++i)
            {
                query += ", " + items[i];
            }

            query += " FROM " + tableName + " WHERE " + col[0] + "=" + "'" + values[0] + "' ";
            for (int i = 1; i < col.Length; ++i)
            {
                query += " AND " + col[i] + "=" + "'" + values[i] + "' ";
            }

            return ExecuteQuery(query);
        }

        #endregion

        #region 按条件查询 单个字段数据

        /// <summary>
        ///  查询表
        /// </summary>
        /// <param name="tableName">表名</param>
        /// <param name="col">查找字段</param>
        /// <param name="operation">运算符</param>
        /// <param name="values">内容</param>
        /// <returns></returns>
        public SqliteDataReader Select(string tableName, string col, string operation, string values)
        {
            string query = "SELECT * FROM " + tableName + " WHERE " + col + " " + operation + " " +
                           string.Format("'{0}'", values);
            return ExecuteQuery(query);
        }

        /// <summary>
        /// 查询表
        /// </summary>
        /// <param name="tableName">表名</param>
        /// <param name="col">查找字段</param>
        /// <param name="values">内容</param>
        /// <returns></returns>
        public SqliteDataReader Select(string tableName, string col, string values)
        {
            string query = "SELECT * FROM " + tableName + " WHERE " + col + " = " + string.Format("'{0}'", values);
            return ExecuteQuery(query);
        }

        #endregion

        #region 升序查询/降序查询/查询表行数/查询表全部数据

        /// <summary>
        /// 升序查询
        /// </summary>
        public SqliteDataReader SelectOrderASC(string tableName, string col)
        {
            string query = "SELECT * FROM " + tableName + " ORDER BY " + col + " ASC";
            return ExecuteQuery(query);
        }

        /// <summary>
        /// 降序查询
        /// </summary>
        public SqliteDataReader SelectOrderDESC(string tableName, string col)
        {
            string query = "SELECT * FROM " + tableName + " ORDER BY " + col + " DESC";
            return ExecuteQuery(query);
        }

        /// <summary>
        /// 查询表行数
        /// </summary>
        public SqliteDataReader SelectCount(string tableName)
        {
            string query = "SELECT COUNT(*) FROM " + tableName;
            return ExecuteQuery(query);
        }

        /// <summary>
        /// 查询表中全部数据 param tableName=表名 
        /// </summary>
        public SqliteDataReader ReadFullTable(string tableName)
        {
            string query = "SELECT * FROM " + tableName;
            return ExecuteQuery(query);
        }

        #endregion

        /// <summary>
        /// 执行SQL语句 用于SelectWhere查询语句
        /// </summary>
        /// <param name="sqlQuery"></param>
        /// <returns></returns>
        public SqliteDataReader ExecuteQuery(string sqlQuery)
        {
            Debug.Log("ExecuteQuery:: " + sqlQuery);
            cmd = conn.CreateCommand();
            cmd.CommandText = sqlQuery;
            try
            {
                reader = cmd.ExecuteReader();
            }
            catch (Exception e)
            { 
                Debug.LogError(e);
                return null;
            }

            return reader;
        }

        #endregion
    }
}

2.屏幕截图,获取图片的base64字节流
在这里插入图片描述
3.将pdf文件转成base64字节流插入数据库
在这里插入图片描述
4.完整代码如下:

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using Cysharp.Threading.Tasks;
using Imdork.SQLite;
using Manager;
using Tool;
using UnityEngine;
using UnityEngine.UI;

public class SQLiteManager : MonoSingleton<SQLiteManager>
{
    #region 数据基本设置

    /// <summary>
    /// 数据库名称
    /// </summary>
    [Header("数据库名称")] public string UseTableName = "UseTable";

    /// <summary>
    /// 数据库路径
    /// </summary>
    private string UseTablePath;

    [HideInInspector] public List<DataBase> dataList;

    /// <summary>
    /// 打印层相机
    /// </summary>
    public Camera printCamera;

    /// <summary>
    /// 所有图片更新GO
    /// </summary>
    public List<GameObject> AllTables;

    /// <summary>
    /// 截图路径
    /// </summary>
    string _path = Application.streamingAssetsPath + "/PrintImage/Screenshot";

    string pathPDF = Application.streamingAssetsPath + @"\test.pdf"; //要打印的目标图片

    private List<string> allImagePath;

    private Coroutine _CreatPDF;
    private GameObject curGO;
    Rect rect;
    RenderTexture rt;

    void Awake()
    {
        rect = new Rect(0, 0, 1920, 1080);
        rt = new RenderTexture((int)rect.width, (int)rect.height, 0);
        UseTablePath = "Data Source = " + Application.streamingAssetsPath + "/" + UseTableName;
    }

    public void Start()
    {
        for (int i = 0; i < AllTables.Count; i++)
        {
            AllTables[i].SetActive(false);
        }

        ToInsertData();
    }

    void ToInsertData()
    {
        DataBase curDataBase = new DataBase();
        curDataBase.ProjectName = "我是测试项目";
        curDataBase.UserName = "测试";
        curDataBase.UserID = "000000000000000000";
        curDataBase.Time = DateTime.Now.ToString("yyyy年MM月dd日 HH:mm");
        PrintImage(curDataBase);
    }

    /// <summary>
    /// 读取配置文件  账号登录
    /// </summary>
    /// <param name="path"></param>
    /// <param name="callBack"></param>
    /// <returns></returns>
    private bool ReadData(string path, Action<string> callBack)
    {
        if (!File.Exists(path))
        {
            return false;
        }

        var str = File.ReadAllText(path);
        callBack?.Invoke(str);
        return true;
    }

    #endregion

    #region 用户信息表格

    /// <summary>
    /// 获取当前用户的所有信息
    /// </summary>
    public void GetAllUseData()
    {
        GetDB(db =>
        {
            var reader = db.ReadFullTable("UserData");

            List<DataBase> _userDatas = SQLiteUtility.GetDataValues(reader);
            dataList.Clear();
            if (_userDatas != null)
            {
                for (int i = 0; i < _userDatas.Count; i++)
                {
                    if (_userDatas[i].UserID == "000000000000000000")
                    {
                        dataList.Add(_userDatas[i]);
                    }
                }
            }
        });
    }

    /// <summary>
    /// 插入当前患者数据
    /// </summary>
    /// <param name="curUserData"></param>
    public void InsertUserData(DataBase curUserData)
    {
        GetDB(db =>
        {
            db.InsertInto("UserData", GetSingleUserData(curUserData));
            if (_CreatPDF != null) StopCoroutine(_CreatPDF);
        });
    }

    /// <summary>
    /// 将单个userdata数据拼接成字符串  按照数据库表顺序
    /// </summary>
    /// <param name="curUserData"></param>
    /// <returns></returns>
    String[] GetSingleUserData(DataBase curUserData)
    {
        List<string> strList = new List<string>();

        strList.Add(curUserData.UserName);
        strList.Add(curUserData.UserID);
        strList.Add(curUserData.ProjectName);
        strList.Add(curUserData.Time);
        strList.Add(curUserData.PrintImage);

        return strList.ToArray();
    }

    #endregion


    /// <summary>
    /// 调用数据库
    /// </summary>
    /// <param name="action"></param>
    public void GetDB(Action<DbAccess> action)
    {
        //Path数据库文件,一定是StreamingAssets文件夹下 填写的路径文件不需要填写.db后缀
        //创建数据库读取类
        SQLiteHelper helper = new SQLiteHelper(UseTablePath);
        //打开数据库 存储数据库操作类
        using (var db = helper.Open())
        {
            //调用数据库委托
            action(db);
        }
        /*
         因为每次使用数据 添/删/改/查 都需要使用完后Close掉
         重复代码,写无数次太麻烦 因为数据库操作类 继承了IDisposable接口 所以,
         using会自动关闭数据库连接,我们无需手动关闭数据库
         */
    }


    private void OnDestroy()
    {
        GetDB(db => db.Dispose());
    }

    #region 截图  打印

    /// <summary>
    /// 截图
    /// </summary>
    public async void PrintImage(DataBase _dataBase)
    {
        Debug.LogError(_dataBase.ProjectName);
        for (int i = 0; i < AllTables.Count; i++)
        {
            Debug.LogError(AllTables[i].name);
            if (_dataBase.ProjectName.Contains(AllTables[i].name))
            {
                AllTables[i].SetActive(true);
                curGO = AllTables[i];
            }
            else
            {
                AllTables[i].SetActive(false);
            }
        }

        allImagePath = new List<string>();
        Debug.LogError(curGO.transform.childCount);
        for (int i = 0; i < curGO.transform.childCount; i++)
        {
            allImagePath.Add(_path + i + ".png");
            ScreenTool(_path + i + ".png");
            await Task.Delay(500);
            curGO.transform.GetChild(i).gameObject.SetActive(false);
        }

        _CreatPDF = StartCoroutine(CreatPDF(_dataBase));
    }

    /// <summary>
    /// 截图
    /// </summary>
    /// <param name="path"></param>
    async void ScreenTool(string path)
    {
        printCamera.targetTexture = rt;
        printCamera.Render();
        RenderTexture.active = rt;
        Texture2D _screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGBA32, false);
        _screenShot.ReadPixels(rect, 0, 0);
        _screenShot.Apply();
        await UniTask.Yield(PlayerLoopTiming.LastPostLateUpdate);
        printCamera.targetTexture = null;
        RenderTexture.active = null;
        var bytes = _screenShot.EncodeToPNG();
        await File.WriteAllBytesAsync(path, bytes);
        Debug.LogError($"截屏了一张照片: {path}");
    }

    /// <summary>
    /// 创建pdf
    /// </summary>
    /// <param name="_dataBase"></param>
    /// <returns></returns>
    public IEnumerator CreatPDF(DataBase _dataBase)
    {
        using (PDFReport pdf = new PDFReport())
        {
            yield return pdf.Init(pathPDF);
            for (int i = 0; i < allImagePath.Count; i++)
            {
                pdf.AddImage(allImagePath[i]);
            }
        }

        yield return new WaitForSeconds(0.2f);
        string strBase = System.Convert.ToBase64String(File.ReadAllBytes(pathPDF));
        _dataBase.PrintImage = strBase;
        InsertUserData(_dataBase);
        Debug.Log("创建成功打开文件:" + pathPDF);
    }

    #endregion
}

五、将本地图片文件上传至服务器,服务器返回一个图片文件下载地址,通过下载地址下载对应的图片文件

注解:在这里需要一个后台服务器用来储存文件地址并返回下载地址,所以在此直接做成一个工具类,调用接口直接传服务器请求URL和本地文件路径:

using System;
using System.IO;
using System.Net;
using System.Text;
using UnityEngine;

public static class HttpTool
{
    /// <summary>
    /// Http上传文件
    /// </summary>
    /// <param name="url">服务器地址</param>
    /// <param name="path">文件路径</param>
    /// <returns>服务器返回的文件下载地址</returns>
    public static string HttpUploadFile(string url, string path)
    {
        HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
        CookieContainer cookieContainer = new CookieContainer();
        request.CookieContainer = cookieContainer;
        request.AllowAutoRedirect = true;
        request.Method = "POST";
        string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线
        request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;
        byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n");
        byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
        int pos = path.LastIndexOf("\\");
        string fileName = path.Substring(pos + 1);

        StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name=\"file\";filename=\"{0}\"\r\nContent-Type:application/octet-stream\r\n\r\n", fileName));
        byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString());

        FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
        byte[] bArr = new byte[fs.Length];
        fs.Read(bArr, 0, bArr.Length);
        fs.Close();

        Stream postStream = request.GetRequestStream();
        postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
        postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
        postStream.Write(bArr, 0, bArr.Length);
        postStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
        postStream.Close();
        HttpWebResponse response = request.GetResponse() as HttpWebResponse;
        Stream instream = response.GetResponseStream();
        StreamReader sr = new StreamReader(instream, Encoding.UTF8);
        string content = sr.ReadToEnd();
        DataShellStr _data = JsonUtility.FromJson<DataShellStr>(content);//这里需要序列化,获取后台返回的文件下载地址
        Debug.Log(content);
        return _data.data;
    }
    
}

PS:附带一个博主网络请求常用的方法:RestClient插件,请求失败2秒后继续请求
在这里插入图片描述

项目源码,包含相关插件和完整代码。希望能够帮到你,别忘记点赞+收藏哦,谢谢。。。

[百度网盘地址]
链接:https://pan.baidu.com/s/1-xcJEBgONxLhxenLnT95RQ
提取码:6666
–来自百度网盘超级会员V6的分享

  • 21
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Unity中,我们可以通过以下步骤将服务器上的图片保存到本地并加载: 1. 首先,我们需要使用Unity中的WebRequest类来从服务器下载图片。通过创建一个新的WebRequest对象,指定要下载图片的URL地址。 2. 使用WebRequest的GetResponse方法发送请求,并获取服务器的响应。我们可以使用GetResponseStream方法来获取图片的二进制数据流。 3. 创建一个新的文件流对象,用于保存下载图片。可以使用FileStream类来创建一个新的文件流对象,并指定图片保存路径。 4. 从服务器响应的数据流中读取二进制数据,并将其写入到本地文件流中。我们可以使用StreamReader和StreamWriter类来读写数据。 5. 关闭文件流和网络响应,确保资源的正确释放。 6. 在Unity中,可以使用Texture2D类来加载本地保存图片。通过创建一个新的Texture2D对象,并使用它的LoadImage方法来加载本地图片。确保将本地图片的路径作为参数传递给LoadImage方法。 7. 最后,你可以将Texture2D对象应用到游戏对象的材质中,或者使用它来作为UI组件的贴图。 这样,我们就可以在Unity中从服务器下载图片保存到本地,并通过Texture2D来加载和使用它们了。 ### 回答2: 在Unity下载服务器上的图片保存到本地并加载的步骤如下: 1. 使用UnityWebRequest从服务器下载图片文件。首先,创建一个UnityWebRequest对象,并设置其下载的URL链接为服务器上的图片地址。然后,发送该请求并等待下载完成。 2. 在下载完成后,可以通过检查UnityWebRequest的isNetworkError和isHttpError属性来确保下载没有发生错误。如果没有错误,可以获取下载图片数据。 3. 创建一个本地文件路径和文件名,在本地保存下载图片。可以使用File.ReadAllBytes或File.WriteAllBytes方法将该图片数据保存到指定的本地路径和文件名中。 4. 要在Unity场景中加载保存图片,可以使用Texture2D对象。创建一个新的Texture2D实例,并使用ImageConversion.LoadImage方法从本地路径加载已保存图片。 5. 在需要显示图片的地方,比如材质的贴图,使用Texture2D对象作为贴图的属性值。 综上所述,以上是Unity下载服务器图片保存到本地并加载的简要步骤。根据实际需求和具体情况,可以进行进一步的优化和扩展。 ### 回答3: 在Unity下载服务器上的图片保存到本地并加载非常简单。以下是一个简单的步骤: 1. 首先,确保你有一个可以访问的图片的URL。你可以使用任何图像URL,也可以使用你自己的服务器上的图像URL。 2. 在Unity中创建一个空的游戏对象,并添加一个脚本。 3. 在脚本中使用WWW类下载图片。在Start函数中添加以下代码: ``` IEnumerator DownloadImage() { string url = "https://example.com/image.jpg"; // 替换为你的图片URL WWW www = new WWW(url); yield return www; // 保存图像到本地 string savePath = Application.persistentDataPath + "/image.jpg"; System.IO.File.WriteAllBytes(savePath, www.bytes); } void Start() { StartCoroutine(DownloadImage()); } ``` 4. 这段代码使用WWW类创建了一个用于下载图片的请求。我们使用协程来处理异步下载,并在下载完成后保存图像到本地。 5. 图片下载完成后,我们使用Application.persistentDataPath(持久数据路径)保存图像。这个路径是应用程序可以使用的目录,可以用来保存应用程序的数据文件。 6. 现在,我们需要在Unity中加载本地图像并将其显示出来。我们可以使用Sprite Renderer组件来显示加载的图像。在脚本中继续添加以下代码: ``` void LoadImage() { string loadPath = Application.persistentDataPath + "/image.jpg"; // 从本地加载图像 Texture2D texture = new Texture2D(1, 1); texture.LoadImage(System.IO.File.ReadAllBytes(loadPath)); // 创建Sprite并显示图像 SpriteRenderer spriteRenderer = GetComponent<SpriteRenderer>(); spriteRenderer.sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f)); } void Update() { if (Input.GetKeyDown(KeyCode.Space)) // 在Update函数中检测键盘按键 { LoadImage(); } } ``` 7. 在这个代码中,我们首先创建了一个空的2D纹理,并从本地文件加载图像数据。接下来,我们使用这个纹理创建了一个Sprite,并将其分配给SpriteRenderer组件来显示图像。 8. 最后,在Update函数中,我们检测是否按下了空格键,并在按下时调用LoadImage函数来加载和显示图像。 这样,你就可以成功下载服务器图片保存到本地并加载到Unity中了。记得将图片URL替换为你自己服务器上的URL。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值