Dans quel type de colonne sauvegardez-vous vos données? Si la pièce jointe peut être de n'importe quel type, vous avez besoin d'une colonne bytea pour vous assurer que les données sont simplement transmises en tant que blob ("grand" objet binaire). Comme mentionné dans d'autres réponses, cette erreur indique que certaines données envoyées à PostgreSQL et marquées comme étant du texte en codage UTF-8 n'étaient pas valides.
Je vous recommande de stocker les pièces jointes en tant que binaire avec leur en-tête de type de contenu MIME. L'en-tête Content-Type doit inclure le codage de caractères nécessaire pour convertir le contenu binaire en texte pour les pièces jointes lorsque cela a du sens: par ex. "text/plain; jeu de caractères = iso-8859-1".
Si vous souhaitez que le texte décodé soit disponible dans la base de données, vous pouvez demander à l'application de le décoder et de stocker le contenu textuel, avec éventuellement une colonne supplémentaire pour la version décodée. C'est utile si vous voulez utiliser l'indexation de texte intégral de PostgreSQL sur les pièces jointes, par exemple. Cependant, si vous voulez simplement les stocker dans la base de données pour les récupérer plus tard, il suffit de les stocker en tant que binaires et de vous soucier de l'encodage du texte dans l'application.