Enregistrer les fichiers dans la base de données, il suffit de convertir à un tableau d'octets?
Est la conversion d'un fichier dans un tableau d'octets, la meilleure façon d'économiser de TOUT format de fichier sur le disque ou la base de données var colonne binaire?
Donc, si quelqu'un veut sauver un .gif ou .doc/.docx ou .fichier pdf, puis-je le convertir en un objet bytearray UFT8 et l'enregistrer dans la bd comme un flux d'octets?
Vous devez vous connecter pour publier un commentaire.
Car il n'est pas mentionné, la base de données que vous voulez dire que je suis en supposant que SQL Server. Ci-dessous la solution fonctionne pour 2005 et 2008.
Vous devez créer une table avec
VARBINARY(MAX)
comme l'une des colonnes. Dans mon exemple, j'ai créé une TableRaporty
avec la colonneRaportPlik
êtreVARBINARY(MAX)
colonne.Méthode pour mettre
file
dans la base de données dedrive
:Cette méthode est d'obtenir
file
à partir de la base de données et l'enregistrer surdrive
:Cette méthode est d'obtenir
file
à partir de la base de données et le mettre commeMemoryStream
:Cette méthode est de mettre
MemoryStream
dans la base de données:Heureux de codage 🙂
Alors que vous pouvez stocker des fichiers dans ce mode, elle a d'importants avantages et des inconvénients:
Ces sont quelques-uns des inconvénients je peux trouver sur le dessus de ma tête. Pour les petits projets, il peut être intéressant de stocker des fichiers dans ce mode, mais si vous êtes à la conception de l'entreprise de logiciels de qualité je recommande fortement contre elle.
Cela dépend vraiment sur le serveur de base de données.
Par exemple, SQL Server 2008 prend en charge un
FILESTREAM
type de données pour exactement cette situation.Autre que cela, si vous utilisez un
MemoryStream
, il a unToArray()
méthode qui permet de convertir à unbyte[]
- ce qui peut être utilisé pour le remplissage d'unevarbinary
champ..Oui, la meilleure façon de stocker un fichier dans une base de données pour enregistrer le tableau d'octets dans une colonne BLOB. Vous voudrez probablement un couple de colonnes de stocker le fichier de métadonnées comme le nom, l'extension, et ainsi de suite.
Il n'est pas toujours une bonne idée de stocker des fichiers dans la base de données - par exemple, la taille de base de données va se développer rapidement si vous stockez des fichiers. Mais que tout dépend de votre utilisation.
Blob
est applicable à Oracle, pas à SQL Server.Confirmant j'ai été en mesure d'utiliser la réponse posté par MadBoy et édité par Otiel sur MS SQL Server 2012 et 2014, en plus des versions précédemment indiquées à l'aide de colonnes varbinary(MAX).
Si vous vous demandez pourquoi vous ne pouvez pas "Filestream" (indiqué dans une réponse distincte) comme un type de données dans la table SQL Server designer ou pourquoi vous ne pouvez pas définir une colonne du type de données à "Filestream" à l'aide de T-SQL, c'est parce que FILESTREAM est un attribut de stockage de la varbinary(MAX) type de données. Il n'est pas un type de données sur son propre.
Voir ces articles sur la configuration et l'activation de FILESTREAM sur une base de données:
https://msdn.microsoft.com/en-us/library/cc645923(v=sql.120).aspx
http://www.kodyaz.com/t-sql/default-filestream-filegroup-is-not-available-in-database.aspx
Une fois configuré, un filestream activé varbinary(max) de la colonne peut être ajouté comme suit:
ALTER TABLE TableName
AJOUTER ColumnName varbinary(max) FILESTREAM NULL
ALLER
Je vais décrire la façon dont je l'ai stocké des fichiers, dans SQL Server et Oracle. Elle dépend en grande partie sur la façon dont vous avez trouvé le fichier, en premier lieu, la façon dont vous obtiendrez de son contenu, et cela dépend de la base de données que vous utilisez pour le contenu dans lequel vous allez stocker pour la façon dont vous allez stocker. Ce sont 2 base de données distincte des exemples avec 2 méthodes pour récupérer le fichier que j'ai utilisé.
SQL Server
Réponse courte: j'ai utilisé un base64 chaîne d'octets que je me suis converti à un
byte[]
et de les stocker dans unvarbinary(max)
champ.Réponse longue:
Dire que vous êtes le téléchargement via un site web, de sorte que vous êtes en utilisant un
<input id="myFileControl" type="file" />
de contrôle, ou d'y Réagir de DropZone. Pour obtenir le fichier, vous faites quelque chose commevar myFile = document.getElementById("myFileControl")[0];
oumyFile = this.state.files[0];
.À partir de là, j'avais eu le base64 chaîne à l'aide de code ici: Convertir les données d'entrée=fichier de tableau d'octets (utilisation de la fonction
UploadFile2
).Alors j'aimerais obtenir cette chaîne, le nom de fichier (
myFile.name
) et le type (myFile.type
) dans un objet JSON:et publier le fichier sur un MVC serveur principal à l'aide de XMLHttpRequest, la spécification d'un Type de Contenu de
application/json
:xhr.send(JSON.stringify(myJSONObj);
. Vous avez à construire un ViewModel de la lier avec:et spécifier
[FromBody]MyModel myModelObj
comme le passé en paramètre:Ensuite, vous pouvez ajouter ce dans cette fonction et de l'enregistrer à l'aide de Entity Framework:
tblAtchm.File = System.Convert.FromBase64String(myModelObj.file);
étant le dispositif de la ligne.Vous auriez besoin d'un modèle pour représenter la table de base de données:
Cela permettra d'enregistrer les données dans un
varbinary(max)
champ comme unbyte[]
.Name
etType
ont éténvarchar(250)
etnvarchar(10)
, respectivement. Vous pourriez inclure la taille en l'ajoutant à votre table comme unint
colonne &MY_ATTACHMENT_TABLE_MODEL
commepublic int Size { get; set;}
, et ajouter dans la ligne detblAtchm.Size = System.Convert.FromBase64String(myModelObj.file).Length;
ci-dessus.Oracle
Réponse courte: Convertir un
byte[]
, l'assigner à unOracleParameter
, l'ajouter à votreOracleCommand
, et la mise à jour de votre tableBLOB
champ à l'aide d'une référence pour le paramètre deParameterName
valeur::BlobParameter
Réponse longue:
Quand j'ai fait cela pour Oracle, j'ai été en utilisant un
OpenFileDialog
et je l'ai récupéré et envoyé les octets/informations de fichier de cette façon:Et à l'intérieur de l'Oracle de mise à jour, avec l'ADO:
Et le type de données pour la
FILE_CONTENTS
colonne a étéBLOB
, leFILE_SIZE
étaitNUMBER(10,0)
,LAST_MODIFIED
étaitDATE
, et le reste a étéNVARCHAR2(250)
.La base de données que vous utilisez? normalement vous n'enregistrez pas les fichiers d'une base de données mais je pense que sql 2008 a soutien pour elle...
D'un fichier de données binaires donc UTF 8 n'a pas d'importance ici..
UTF 8 questions lorsque vous essayez de convertir une chaîne en un tableau d'octets... pas un fichier de tableau d'octets.