Я работаю над функцией, которая позволяет пользователю загружать 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, а затем расшифровав его, чтобы люди могли его просматривать.Не уверен, что это переводит в узел / реагировать.
Спасибо!