Jquery 使用Ajax发布URL编码的文件数据

Jquery 使用Ajax发布URL编码的文件数据,jquery,ajax,html,filereader,Jquery,Ajax,Html,Filereader,有可能这样做吗?更详细地说: 我有一个从输入元素检索到的文件对象 我想把它上传到服务器上,还有几个 具有相关数据文件名的键/值对,等等 我想用Ajax实现这一点,因为系统中的所有其他东西 使用Ajax,并且我基于 服务器响应 我想用URL编码来实现这一点,因为文件很小,而且 服务器未实现多部分/表单数据 我试过几种不同的方法,但没有一种是完全正确的。此代码“按原样”发送文件数据,即有效的原始二进制文件,而不是URL编码的键值对: var files = document.getElemen

有可能这样做吗?更详细地说:

我有一个从输入元素检索到的文件对象 我想把它上传到服务器上,还有几个 具有相关数据文件名的键/值对,等等 我想用Ajax实现这一点,因为系统中的所有其他东西 使用Ajax,并且我基于 服务器响应 我想用URL编码来实现这一点,因为文件很小,而且 服务器未实现多部分/表单数据 我试过几种不同的方法,但没有一种是完全正确的。此代码“按原样”发送文件数据,即有效的原始二进制文件,而不是URL编码的键值对:

   var files = document.getElementById('idUploadBrowseInput').files;
   var fdata = files[0];
   var jqxhr = $.ajax({
      type        : "POST",
      url         : "/cgi-bin/upload_cgi",
      timeout     : 20000,
      processData : false,
      data        : fdata
   }).always(...etc)
原始二进制可以,但我还需要其他键值对,而且似乎不可能同时发送这些

如果我将data:fdata行更改为data:{fdata:fdata},那么POST数据就变成FF上的[object object]。如果删除processData:false,则jQuery中会出现异常

FileReader API有一些readAs方法,我想我应该使用这些方法——假设,如果我将文件内容读入一个变量,那么我就可以将该变量作为数据对象的一部分发送,它应该可以正常工作。然而,这是一个冗长的过程,我只想检查一下,没有一种更直接的方法可以先做到这一点


请注意,这并不能回答问题。

我已经使用AJAX和jQuery发送了一个文件,甚至有两种不同的方法:

const fileInput = document.getElementById('file-upload'); // refers to <input type="file">
const file = fileInput.files[0];

let reader = new FileReader();

reader.onload = function () {
  console.log(reader.result);

  $.ajax({
    type: 'POST',
    url: '/file-upload',

    // data: { file: reader.result }, // #1

    // data: reader.result,           // #2
    // processData: false,

    success: function (response) {
      alert(response);
    }
  });
}

// reader.readAsBinaryString(file); // #1
// reader.readAsArrayBuffer(file);  // #2
第二种方法以原始形式发送文件-整个内容是纯二进制数据:

POST /file-upload HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Content-Length: 12342
Accept: */*
Origin: http://127.0.0.1:8080
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36 OPR/56.0.3051.116
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://127.0.0.1:8080/test
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US;q=0.8,en;q=0.7

É[ñY+Æ\»H*|ṲFÝ▒§®Y3NÙ+2¤"ã0èT...

注意“内容长度”字段-原始表单肯定更为优化,但它不允许您方便地发送任何其他键值对数据,如第一个表单。

不确定,请澄清要求?简而言之,在使用Ajax时,您是否可以将URL编码的文件“object”作为键值对与其他键值对一起发送?如果可能,是否可以发布cgi片段?请澄清这个问题?是否尝试将文件对象作为base64字符串?还是编码组件文件?试试Blob和FileReder?看见
POST /file-upload HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Content-Length: 12342
Accept: */*
Origin: http://127.0.0.1:8080
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36 OPR/56.0.3051.116
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://127.0.0.1:8080/test
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US;q=0.8,en;q=0.7

É[ñY+Æ\»H*|ṲFÝ▒§®Y3NÙ+2¤"ã0èT...