Используйте реагировать для хранения двоичных данных на SQL Server - PullRequest
0 голосов
/ 03 мая 2019

Я работаю над функцией, которая позволяет пользователю загружать PDF в базу данных SQL Server.Пользователь нажимает кнопку, чтобы открыть диалоговое окно файла, и выбирает PDF-файл, который он хочет загрузить.База данных SQL Server занимает varbinary(max).

Я использую base64 для кодирования файла, однако получаю сообщение об ошибке:

RequestError: Неявное преобразование из типа данных varchar в varbinary (max) недопустимо.Используйте функцию CONVERT для выполнения этого запроса

Похоже, я посылаю строку, а не двоичный файл.

Вот код, который я использую:

React.js

import React, { Component } from 'react';
import './styles.css';
import base64 from 'base-64';

class SaveSDS extends Component {
    constructor() {
        super();
        this.state = { user: {} };
        this.chemNameField = React.createRef(); // create ref for first name field
    }

    state = {
        file: null
    }

    handleFile(e) {
        e.preventDefault();
        let file = e.target.files[0];
        this.setState({file: file});
      }

      handleUpload(e){
        e.preventDefault();
        const data = new FormData();
        let file = this.state.file;
        data.append('file', file)
        var r = new FileReader();
        fetch('http://localhost:5000/db', {
            method: 'POST',
            headers: { "Content-Type": "application/json" },
            mode: 'no-cors',
            body: JSON.stringify({
                chemName: this.chemNameField.current.value,
                chemPDF: base64.encode(data)
            })
        })
        .then((res) =>{
            console.log(res)
        });

      }

      render() {
        return (
            <div className="submitForm">          
                    <div style={{padding: "10px"}}>
                        <input className="fileButton" type="file" accept=".pdf" name="file" onChange={(e) => this.handleFile(e)} />
                    </div>
                    <input type="text" style={{width: "50%"}} placeholder="Enter chemical name"  ref={this.chemNameField} />
                    <br />
                    <button type="button" onClick={(e) => this.handleUpload(e)}>Upload</button>
            </div>
        );
      }
}

export default SaveSDS;

А вот что я использую в экспрессеside:

Server.js

const express = require('express');
const bodyParser = require('body-parser');
var sql = require("mssql");
const app = express();
app.use(bodyParser.json());
app.use(express.json({
    type: ['application/json', 'text/plain']
  }));

var config = {
    user: 'user',
    password: 'pass',
    server: 'localhost', 
   database: 'Master' 
};

app.post('/db', function(req, res) {
    console.log(req.body)
    res.set('Access-Control-Allow-Origin', '*');
    let connection = new sql.ConnectionPool(config, function(err) {
        let request = new sql.Request(connection);
        request.query("insert into chemicals (chemName, chemPDF) values ('" + req.body.chemName + "', '" + req.body.chemPDF + "')");
    });
});

const port = process.env.PORT || 5000; //get the process port
app.listen(port, () => console.log(`Server running on port ${port}`));

Можно ли даже отправить двоичный файл на сервер от реакции или проще преобразовать в двоичный файл набэкенд?Возможно, мой подход совершенно неверен.

По сути, я хочу, чтобы пользователь мог загружать файл, а затем разрешать другим пользователям открывать и просматривать этот файл.Я сделал это в C #, загрузив двоичный файл на SQL Server, а затем расшифровав его, чтобы люди могли его просматривать.Не уверен, что это переводит в узел / реагировать.

Спасибо!

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