POST отключение данных PDF - PullRequest
       8

POST отключение данных PDF

1 голос
/ 02 августа 2020

Вчера я разместил вопрос (ссылка здесь ), где я пытался отправить PDF-файл в базу данных, а затем получить его позже. С тех пор мне сообщили, что лучше всего (в моем случае, поскольку я не могу использовать службы облачных вычислений) загрузить файлы PDF в локальное хранилище и вместо этого сохранить URL-адрес файла в базе данных. Я начал реализовывать это, но столкнулся с некоторыми проблемами.

В настоящее время я использую FileReader (), как описано ниже, для обработки входного файла и отправки его на сервер:

var input_file = "";
let reader = new FileReader();
reader.readAsText(document.getElementById("input_attachment").files[0]);
reader.onloadend = function () {
    input_file = "&file=" + reader.result;
    const body = /*all the rest of my data*/ + input_file;
    const method = {
        method: "POST",
        body: body,
        headers: {
            "Content-type": "application/x-www-form-urlencoded"
        }
    };

После этого блока c кода я выполняю стандартную fetch (), и маршрут на моем сервере получает это. Почти все данные поступают на 100%, как и ожидалось, но файл обрезан примерно на 1300 символов (что делает его довольно неполным PDF). То, что действительно появляется, похоже, соответствует первым 1300 символам исходного загруженного мной PDF-файла.

Я видел предложения о том, что вы должны использовать тип содержимого "multipart / form-data" для загрузки файлов, но когда я это делаю, мне кажется, только тогда я получаю первые 700 символов моего PDF-файла. Я пробовал использовать промежуточное ПО Multer для обработки "multipart / form-data", но оно, похоже, ничего не загружает (хотя я не могу гарантировать, что использую его правильно).

Я также изначально имелись проблемы с сообщением об ошибке выборка слишком большой нагрузки , но в настоящее время я решил эту проблему с помощью этого метода:

app.use(bodyParser.urlencoded({ limit: "50mb", extended: false, parameterLimit: 50000 }));

Хотя у меня есть подозрения, что это может быть неправильно реализовано, как я видел некоторое обсуждение того, что ограничение urlencoded устанавливается до загрузки файла и не может быть изменено в середине программы.

Любая помощь приветствуется, и я, вероятно, буду использовать любую информацию здесь, чтобы построить ответ на мой вчерашний исходный вопрос, чтобы у всех, кто сталкивается с подобными проблемами, был ресурс от go до

1 Ответ

0 голосов
/ 17 августа 2020

Я лично нашел решение этой проблемы следующим образом. На стороне клиента моего приложения этот код является примером того, что было реализовано.

formData = new FormData();
formData.append("username", "John Smith");
formData.append("fileToUpload", document.getElementById("input_attachment").files[0]);
const method = {
    method: "POST",
    body: formData
};
fetch(url, method)
    .then(res => res.json())
    .then(res => alert("File uploaded!"))
    .catch(err => alert(err.message))

Как можно заметить, я изменил кодировку «application / x- www-form-urlencoded» на «multipart / form-data "для загрузки файлов. Однако nodeJS и Express изначально не поддерживают этот тип кодирования. Я решил использовать библиотеку Formidable (оказалось, что ее проще всего использовать без особых накладных расходов), которую можно исследовать по поводу здесь . Ниже приведен пример моей серверной реализации этого промежуточного программного обеспечения (Formidable).

const express = require('express');
const app = express();
const formidable = require('formidable');

app.post('/upload', (req, res) => {
    const form = formidable({ uploadDir: `${__dirname}/file/`, keepExtensions: true });
    form.parse(req, (err, fields, files) => {
        if (err) console.log(err.stack);
        else {
            console.log(fields.username);
    });
});

Файл (ы) автоматически выгружаются в каталог, указанный в uploadDir, а keepExtensions гарантирует, что расширение файла также сохранены. Нефайловые входы доступны через объект fields, как видно из приведенного выше примера fields.username.

Из того, что я обнаружил, это самый простой метод настройки простой системы загрузки файлов.

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