Получить запрос формата POST с вложением - PullRequest
0 голосов
/ 31 августа 2018

Я пытался разобраться в этом формате запроса, но, похоже, не могу этого сделать.

Это HTML:

<form id='emailAttachmentsForm'>
   <input name='file' id='emailAttachmentInput' type='file' accept='.gif, .jpg, .png'>
</form>

Вот что у меня на стороне сервера:

   def email_params
      params.require(:email).permit(:to, :subject, :body, :has_payment_link, :send_me_copy,
        email_attachments_attributes: [ :file ]
      )
    end

Я пытаюсь отформатировать fetch запрос как с JSON, так и с изображением (jpg, pdf, что угодно).

Это моя текущая итерация, за которой следуют вещи, которые я пробовал:

    let emailFormData = new FormData();

    let attachment = document.getElementById('emailAttachmentInput').files[0]

    let body = {
            'to': $('#invoice-view-email-to').val(),
            'email':$('#invoice-view-email-to').val(),
            'subject': $('#invoice-view-email-subject').val(),
            'body': $('#invoice-view-email-body').val(),
            'has_payment_link': true,
            'send_me_copy': sendSelfCopy,
            'email_attachments_attributes': [{'file': attachment}]
    }

    emailFormData.append('email', body)


    console.log(emailFormData.get('email'))

    return fetch(`${app.data.apiUrl}/invoices/${invoiceId}/emails`, {
        method: 'POST', 
        headers: {
            'Authorization': 'Bearer ' + sessionStorage.getItem('token')
        },
        body: emailFormData
        }
    )
    .then(data =>{
        if(!data.ok){
            Promise.reject(data.statusText);
            toastBottomError.open()
        } else if (data.ok && data.status == 201){
            toastBottomEmailSuccess.open();
            } 
        console.log(data)
        data
            .json()
            .then(json =>{
                console.log(json)
        })
        .catch(err => console.error(err))
    })
}

Я пробовал:

Добавление заголовков содержимого типа multipart/form-data и multipart/mixed. Тем не менее, я прочитал , что я мог просто дать понять это автоматически.

Отправка этого запроса в виде приложения / json без вложения. Это отлично работает. Это не обязательная часть запроса.

Проверка, действительно ли файл захвачен. Да.

File(25946) {name: "Smile.jpg", lastModified: 1535726233571, lastModifiedDate: Fri Aug 31 2018 10:37:13 GMT-0400 (Eastern Daylight Time), webkitRelativePath: "", size: 25946, …}

Какая часть головоломки мне здесь не хватает?

Вот ответ на этот запрос:

enter image description here

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

Заранее спасибо за любой совет!

...