Поврежденный zip при загрузке через Ax ios POST - PullRequest
0 голосов
/ 27 апреля 2020

Я «публикую» файл zip в серверном приложении через конечную точку REST. Если я отправлю POST через Postman или веб-интерфейс приложения, я получу опубликованный zip-файл, который действителен. Я могу обернуться скачать его и открыть, и т. Д. c.

Если я попытаюсь сделать то же самое с моим кодом и Ax ios, попытка серверного приложения разархивировать и использовать загруженный контент завершится неудачей. Если я DL архив, он поврежден. Тот факт, что тот же архив работает через Postman и UE приложения, говорит мне, что это либо PEBKA C, либо, возможно, проблема с самим Ax ios. Вот код, который я использую для отправки в конечную точку. Обратите внимание, что в конце я на самом деле записываю данные, которые я помещаю в локальный файл на моем компьютере, в виде zip-файла, чтобы я мог убедиться, что не делаю ничего глупого, когда читаю файл через fs. Локальная копия файла, который я создал, в порядке.

Обратите внимание, что я на самом деле жестко кодирую и длину контента. Я тестирую один файл и проверяю правильность длины с помощью fs.statSyn c, а также то, что она соответствует длине содержимого, которую я вижу при загрузке с помощью Postman и пользовательского интерфейса приложения.

var uploadFile = (data, fileInfo) => new Promise(resolveUpload => {

    console.log("Starting Upload API call for:", fileInfo.description);

    axios.post(aepServer + '/api/v1/files',
            data, {
                jar: cookieJar,
                withCredentials: true,
                headers: {
                    'Content-Type': 'application/octet-stream',
                    'path': fileInfo.path,
                    'description': fileInfo.description,
                    'Content-Length': 354198,
                    'Accept-Encoding': 'gzip, deflate, br',
                    'Accept': '*/*',
                    'Connection': 'keep-alive'

                },
                // DANGER: allow self-signed certs workaround which I must remove 
                httpsAgent: new https.Agent({
                    rejectUnauthorized: false,
                })
            }).then((response) => {
            fileResponse = response.data;
            console.log('\n', chalk.bgMagenta('FILE UPLOADED: '), response);
            fs.writeFileSync('c:\\data\\newfile.zip', data, 'binary');
            resolveUpload(fileResponse);
        })
        .catch((err) => {
            console.log("AXIOS ERROR: ", err);
        })
});

Здесь что-то не так? Глядя на объект ответа, я вижу что-то, что заставляет меня чесать голову:

headers: {
  Accept: '*/*',
  'Content-Type': 'application/octet-stream',
  path: '/Workspaces/Public%20Apps/UFOs.yxzp',
  description: 'UFO Sitings in the US, 1995 to present',
  'Content-Length': 532362,
  'Accept-Encoding': 'gzip, deflate, br',
  Connection: 'keep-alive',
  Cookie: 'ayxSession=s%3Ac39f55a3-b219-43a5-9f8a-785e1222c81c.QR4KI8uXaQlL9axqkO8AkyabPVt3i37nGbz%2FJef0eqU',
  'User-Agent': 'axios/0.19.2'
},

Посмотрите на длину содержимого: 532362 байта. Кажется, что значение ~ 354k, которое я жестко запрограммировал в заголовках, как-то игнорируется. Может ли это быть моей проблемой? [Кстати, если я использую один и тот же код для загрузки файла CSV или TXT, все в порядке - похоже, это относится только к сжатым файлам]

РЕДАКТИРОВАТЬ: Welp, похоже, Ax ios переопределяет это свойство и я ничего не могу с этим поделать: Ax ios установить Content-Length вручную, nodeJS. Теперь вопрос заключается в том, если установка этого значения приведет к изменению файла и ПОЧЕМУ значение неверно. Когда я делаю data.length, я получаю значение 354198.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Мой ответ был здесь:

Чтение бинарных данных в node.js

По сути, я читал zip-файл как «бинарный», когда я должен вообще ничего не передал.

var content = fs.readFileSync(aFile.readFrom);
//NOT
//var content = fs.readFileSync(aFile.readFrom, 'binary');
0 голосов
/ 27 апреля 2020

вы можете попробовать с помощью 'multipart/form-data'

axios.post('upload_file', formData, {
  headers: {
    'Content-Type': 'multipart/form-data'
  }
})

или получить запрос CURL с помощью почтальона и использовать информацию заголовка, предоставленную почтальоном

...