使用react将二进制数据存储到SQL Server

时间:2019-05-03 18:44:40

标签: node.js sql-server reactjs

我正在开发一项功能,该功能允许用户将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;

这是我在快递方面使用的:

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}`));

是否有可能通过react将二进制文件发送到后端,还是在后端转换为二进制文件更容易?也许我的方法是完全错误的。

基本上,我希望用户能够上传文件,然后允许其他用户打开并查看该文件。我已经在C#中做到了这一点,将二进制文件上传到SQL Server,然后对其进行解码,以便人们可以查看它。不确定是否转换为节点/反应。

谢谢!

0 个答案:

没有答案