Как я могу сохранить файл в базе данных SQL? - PullRequest
0 голосов
/ 03 января 2019

Я получаю файлы из Angular с этим кодом:

 var httpPostedFile = HttpContext.Current.Request.Files["file"];

Это мой каталог:

 string folderExists = (HttpContext.Current.Server.MapPath("~/abc"));

Как мне сохранить мои файлы в этой папке?

for (int i = 0; i < HttpContext.Current.Request.Files.Count; i++)
{
    var FileName = httpPostedFile.FileName;
    int fileSize = httpPostedFile.ContentLength;
    byte[] fileByteArray = new byte[fileSize];
    httpPostedFile.InputStream.Read(fileByteArray, 0, fileSize);

    string fileLocation = Path.Combine(HttpContext.Current.Server.MapPath("~/App_Data/uploads"), FileName);

    if (!Directory.Exists(HttpContext.Current.Server.MapPath("~/App_Data/uploads")))
        Directory.CreateDirectory(HttpContext.Current.Server.MapPath("~/App_Data/uploads"));

    httpPostedFile.SaveAs(fileLocation);
}

Я сохраняю файлы в папке, но хочу сохранить эти файлы в базе данных SQL.

Моя файловая структура:

 public class FileTable
    {
        [Key]
        public int Id { get; set; }
        public byte[] FileData { get; set; }
        public string FileName { get; set; }
    }

Как я могу сохранитьмой файл в базе данных?

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Если вы используете Entity Framework Core и перенесли миграцию в таблицу, вы можете просто создать новый класс FileTable и присоединить к нему байтовый массив, если он уже находится в базе данных.Вы просто добавили бы его к свойству FileData и затем сохранили его в базе данных.Если вы еще не создали базу данных, просто убедитесь, что столбец для FileData имеет тип varbinary (max).

пример будет:

public void AttachFile(byte[] byteArray, int objectID)
        {
            FileTable currentFileTable = new FileTable();
            currentFileTable = _yourcontext.yourtable.Where(e => e.ID == objectID).FirstOrDefault();
            currentFileTable.FileData = byteArray;
            _yourcontext.yourtable.Update(currentFileTable);
            _yourcontext.SaveChanges();
}

Это сработает, если у вас уже есть объект в базе данных и вы знаете, что это за идентификатор.Если это новый объект, то вы просто сделаете:

public void AttachFile(byte[] byteArray)
            {
                FileTable currentFileTable = new FileTable();                
                currentFileTable.FileData = byteArray;
                //Populate your other properties
                _yourcontext.yourtable.Add(currentFileTable);
                _yourcontext.SaveChanges();
    }
0 голосов
/ 04 января 2019

Вы можете сохранить файл с помощью хранимой процедуры:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[spStoreBinaryFiles]
    @FILE_PATH VARCHAR(MAX)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @FILE_LENGTH BIGINT
    DECLARE @FILE_DATA VARBINARY(MAX)
    DECLARE @FILE_NAME VARCHAR(100)
    DECLARE @DOCUMENT_NAME VARCHAR(100) 
    DECLARE @DOCUMENT_NATURE VARCHAR(5)  

    DECLARE @VAL1 VARCHAR(100)
    DECLARE @VAL2 VARCHAR(100)

    DECLARE curDOCUMENTS CURSOR FOR 
         SELECT *  
         FROM dbo.SPLIT ( ';', @FILE_PATH)

    OPEN curDOCUMENTS

    FETCH NEXT FROM curDOCUMENTS INTO @VAL1, @VAL2

    WHILE @@FETCH_STATUS = 0
    BEGIN
        IF OBJECT_ID('#ORStable') IS NULL 
        BEGIN
            CREATE TABLE #ORStable _
            (Length BIGINT, vDocument VARBINARY(MAX))

            DECLARE @SQL_QUERY NVARCHAR(1000)

            SET @SQL_QUERY = 'INSERT INTO #ORStable
                                SELECT len(bulkcolumn), *
                                FROM OPENROWSET(BULK '''+@VAL2+''', _
                SINGLE_BLOB) AS BinaryData'

            EXEC SP_executesql @SQL_QUERY
        END

        EXEC dbo.spGetDocumentNature @VAL2, @DOCUMENT_NATURE OUTPUT
        EXEC dbo.spGetDocumentName @VAL2, @DOCUMENT_NAME OUTPUT

        SELECT TOP 1 @FILE_LENGTH = Length, @FILE_DATA = vDocument 
        FROM #ORStable

       INSERT INTO dbo.tblBinaryFiles ([File], [Path], [Ext], [Size],[Binary])
       VALUES (@DOCUMENT_NAME, @VAL2, @DOCUMENT_NATURE, @FILE_LENGTH, @FILE_DATA)

       DROP TABLE dbo.#ORStable

       FETCH NEXT FROM curDOCUMENTS INTO @VAL1, @VAL2
   END

   CLOSE curDOCUMENTS
   DEALLOCATE curDOCUMENTS 
END

Теперь вы можете вызвать эту хранимую процедуру следующим образом:

       DECLARE @SQL_QUERY     NVARCHAR(1000)

        SET @SQL_QUERY= '
        INSERT INTO #ORStable
        SELECT len(bulkcolumn), *
        FROM OPENROWSET(BULK '''+@VAL2+''', _
                SINGLE_BLOB) AS BinaryData'
        exec SP_executesql @SQL_QUERY

Здесь переменная VAL2 содержит один файлинформация о пути.

Пример

VAL2 = "\\192.168.1.1\myFiles\yourfile.pdf"

VAL2 = "C:\yourFilesFolder\yourfile.pdf"

Примечание : Если вы используете какой-либо сетевой путь или прямой путь, убедитесь, что ваша папка имеет разрешение на чтение и запись

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...