Как отправлять файлы с помощью суперагента

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

Я могу отправлять файлы с помощью простого ajax:

var fd = new FormData();
        fd.append( 'file', this.refs.File.getDOMNode().files[0] );

        $.ajax({
            url: 'http://localhost:8080/files',
            data: fd,
            processData: false,
            contentType: false,
            type: 'POST',
            success: function(data){
                console.log(data)
            }
        });

Но когда я пытаюсь сделать то же самое в суперагенте, ничего не работает:

var fd = new FormData();
fd.append( 'file', this.refs.File.getDOMNode().files[0] );

Request.post('http://localhost:8080/files')
    .set('Content-Type', false)
    .set('Process-Data', false)
    .attach('file', fd, 'file')
    .end((err, res) => {
        console.log(err);
        console.log(res);
    })

Может кто-нибудь, пожалуйста, скажите мне, что происходит.


person Julien Vincent    schedule 31.07.2015    source источник


Ответы (4)


Это должно работать.

var file = this.refs.File.getDOMNode().files[0];


Request.post('http://localhost:8080/files')
    .set("Content-Type", "application/octet-stream")
    .send(file)
    .end((err, res) => {
        console.log(err);
        console.log(res);
    })
person Codrin Iftimie    schedule 05.08.2015
comment
attach можно использовать только на стороне сервера. Вам нужно указать путь к файлу в качестве второго параметра, и браузер не сможет получить доступ к файловой системе. - person Codrin Iftimie; 11.02.2016
comment
@CodrinIftimie, ваш комментарий вводит в заблуждение. attach отлично работает на стороне переднего плана. Я только что использовал приложение для загрузки файлов здесь в одном из моих проектов. Теоретическая реализация очень хорошо объяснена здесь: abandon.ie/notebook/simple -file-uploads-using-jquery-ajax. - person bstst; 19.02.2016
comment
@bstst эта тема посвящена суперагенту, а не jquery ajax. метод присоединения суперагента поддерживается только в nodejs. - person fisch2; 16.08.2016
comment
@fisch2, вы можете попробовать прочитать мой комментарий еще раз - person bstst; 19.08.2016
comment
мой плохой, я был сбит с толку, так как ссылка не имела ничего общего с комментарием, и до вчерашнего дня приложение + прогресс суперагента не работало в браузере. Ура прогрессу :) - person fisch2; 19.08.2016
comment
Еще одно замечание: .attach отправляет файл как составной. Это работает для веб-серверов, но при загрузке в S3 или другие хранилища объектов вам нужно будет отправить файлы как .send(file). - person geoboy; 30.06.2017

Приложение должно работать.
Пример использования экспресс/мультера:

клиент:

superagent.post('http://localhost:3700/upload').attach('theFile',file);

сервер:

 const storage = multer.memoryStorage();
 const upload = multer({ storage: storage });
 router.post("/upload", upload.single('theFile'), (req, res) => {
   debug(req.file.buffer);
   res.status(200).send( true );
   res.end();
 });
person Hosar    schedule 08.10.2016
comment
Это работает как шарм, и multer очень помогает на стороне сервера. - person Adi Ulici; 22.12.2016
comment
Для меня это работает хорошо. На сервере я использовал async-busboy для разбора мультиформ данных. - person vijayst; 08.01.2018

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

Использование async/await

describe('My App - Upload Module', function(){
  it('Upload Module - ERROR - upload an expired file', async function(){
    try{
      let res = await _upload_license_file("/tmp/test_license.xml");
    }catch(err){
      err.should.have.status(422);
    }
  });
});

async function _upload_license_file(fileLocation){
  return superAgent.post(base_url + "/upload")
          .set('Authorization', 'Bearer '+API_TOKEN)
          .set('Content-Type', 'multipart/form-data')
          .attach('xml_file', fileLocation)
}

Я работал здесь с модулем ошибок, вы можете обрабатывать объект ответа аналогичным образом для случаев пропуска.

person swateek    schedule 04.06.2020

Чтобы заполнить предыдущие ответы и предоставить ссылку, посетите эту страницу: https://visionmedia.github.io/superagent/#multipart-requests

Согласно этому:

Когда вы используете .field() или .attach(), вы не можете использовать .send() и не должны устанавливать Content-Type (для вас будет установлен правильный тип).

Кроме того, даже если здесь это не так, есть много сообщений/вопросов, в которых люди используют имя файла в качестве второго аргумента для .attach. Снова с этой страницы документа:

Вместо этого в браузере создайте Blob соответствующего типа.

Это относится не ко второму аргументу, а к третьему «параметрам», но для меня это означает, что имена файлов не поддерживаются в версии браузера.

person Will59    schedule 10.08.2020