MySQL-将base64编码的数据保存到存储驱动器

时间:2018-09-04 22:37:01

标签: c# mysql sql

我正在构建一个使用临时表的应用程序,文件的大块被上传到临时表,然后使用将文件重新组装成正确顺序的函数来调用存储的proc。我只是想知道SQL中是否有任何内容可以让我将重新组装的文件直接保存到磁盘(例如c:/ path / to / file / filename),或者是否需要让应用读取返回的重新组装的文件从存储的过程中保存文件。

这两种方法都给了我所需的最终结果,只是想知道我是否可以让数据库代替所有工作...或者这是否是一个好主意。

1 个答案:

答案 0 :(得分:0)

想通了我将用我的解决方案更新此帖子的地方:

我为要上传的每个文件生成了一个GUID客户端,并将其用作每个块的文件名,并以块顺序ID开头,因此服务器知道文件需要按哪个顺序重新组装。每个块都将发布到其在服务器上的最终存储位置。我将要上载的总块数与服务器上的总块数进行比较,并检测到何时收到最后一个块,然后将文件重新编译为其原始文件。重新组装上载的文件后,需要执行任何验证。如果验证或上传随时失败,则文件和所有块都将被删除。

下面的代码与我的原始代码相比经过编辑且未经测试。这可以清理一些...

此处未显示客户端JavaScript,该客户端JavaScript使用FileReader API在base64中发布块。

        [HttpPost("chunk-upload")]
    public async Task<IActionResult> ChunkUpload(
        string chunk, 
        int chunkId, 
        bool isLastChunk, 
        string fileName, 
        int totalSize, 
        string uuid)
    {
        byte[] fileAsByteArray;

        try
        {
            fileAsByteArray = Convert.FromBase64String(chunk);
        }
        catch (Exception)
        {
            // delete chunks associated with the file if upload fails
            string[] fileEntries = Directory.GetFiles("your/folder/path/").Where(x => x.Contains(uuid)).OrderBy(x => x).ToArray();
            for(int i = 0; i < fileEntries.Count(); i++)
            {
                System.IO.File.Delete(fileEntries[i]);
            }
        
            return Json(new { error = "Error uploading file, please try again" });
        }

        string saveChunkLocation = "your/folder/path/" + string.Format("{0:0000}_{1}_{2}.mp3", chunkId, uuid)));

        byte[] buffer = new byte[1024 * 1024];

        using (FileStream stream = System.IO.File.Create(saveChunkLocation))
        {                
            await stream.WriteAsync(fileAsByteArray, 0, fileAsByteArray.Length);
        }

        if(isLastChunk)
        {
            MyFileWriterHelper fw = new MyFileWriterHelper();

            string[] fileEntries = Directory.GetFiles("your/folder/path/").Where(x => x.Contains(uuid)).OrderBy(x => x).ToArray();

            byte[][] fileChunks = new byte[fileEntries.Count()][];
            
            for(int i = 0; i < fileEntries.Count(); i++)
            {
                // get file bytes then delete chunk from storage
                fileChunks[i] = System.IO.File.ReadAllBytes(fileEntries[i]);
                System.IO.File.Delete(fileEntries[i]);
            }

            byte[] completeFile = fw.Combine(fileChunks);
            if(completeFile.Length == totalSize)
            {
                var fileFullDestinationPath = "your/folder/path/" + fileName;
                using (FileStream SourceStream = System.IO.File.Create(fileFullDestinationPath))
                {
                    await SourceStream.WriteAsync(completeFile, 0, completeFile.Length);
                }
                
                // Validate file here, using fileFullDestinationPath to pass into whatever validator you're using
                
            }
            else
            {
                return Json(new { error = "Error uploading file, please try again" });
            }
        }

        return Json(new { success = "Upload complete" });
    }