【问题标题】:Send file from clipboard从剪贴板发送文件
【发布时间】:2018-01-22 12:50:43
【问题描述】:

我希望能够将通过打印屏幕按钮拍摄的图像粘贴到文本区域并将其上传到我的服务器。

我正在使用onpaste,它似乎可以工作,我可以获得一个文件对象,但每当我尝试发送它时它都是空的。

onpaste(event) {
  if (event.clipboardData.files.length) {
    let file = event.clipboardData.files[0];

    var oReq = new XMLHttpRequest();
    var data = new FormData();

    data.append("file", file);
    data.append("csrf", CSRF_TOKEN);

    oReq.open("POST", exports.url("/file"));
    oReq.setRequestHeader("Accept", "application/json");

    oReq.send(data);
  }
}

我在我的开发工具中观察到网络选项卡,并且正在正确发送一个请求,其中包含有关文件的所有信息,但没有内容

请求负载

------WebKitFormBoundaryWggS2BbKcZV6v4tn
Content-Disposition: form-data; name="file"; filename="image.png"
Content-Type: image/png


------WebKitFormBoundaryWggS2BbKcZV6v4tn
Content-Disposition: form-data; name="csrf"

58718518696317230756900774635415
------WebKitFormBoundaryWggS2BbKcZV6v4tn--

【问题讨论】:

  • 粘贴图像时画布不是更自然的目标吗?
  • @Teemu 我真的不想显示图像,我只想将它发送到服务器。
  • Mhh... 然后不显示画布。您仍然可以将图像构建到不可见的画布上。
  • @Teemu 如果没有必要,为什么要把它放到一个看不见的画布上?数据在他的剪贴板上。他想将它发送到服务器。先把它塞进画布似乎很奇怪。

标签: javascript html http fileapi


【解决方案1】:

在这种情况下,您通过event.clipboardData.files[0]; 访问的文件实际上只是文件的句柄,它不包含实际的文件数据。要访问它,您必须根据FileAPI documentation 使用 FileReader。

有四种不同的方式可以通过 FileReader 读取这些数据:

void readAsArrayBuffer(Blob blob);
void readAsBinaryString(Blob blob);
void readAsText(Blob blob, optional DOMString label);
void readAsDataURL(Blob blob);

请参阅下面的示例,您可以根据需要对其进行修改。

function onPaste(event) {
  if (event.clipboardData.files.length) {
    let file = event.clipboardData.files[0];
    var oReq = new XMLHttpRequest();
    var data = new FormData();

    data.append("csrf", "TOKEN");

    oReq.open("POST", "/file");
    oReq.setRequestHeader("Accept", "application/json");

    /* Create a new FileReader. */
    var fileReader = new FileReader();
    
    fileReader.onload = function(event) {
      /* Once the file has finished loading, run the following: */
      data.append("file", this.result);
      oReq.send(data);
    };
    
    /* Tell the file reader to asynchronously load the files contents. */
    fileReader.readAsDataURL(file);
  }
}
<textarea onpaste="onPaste(event)" ></textarea>

【讨论】:

  • 这有点令人困惑。为什么我可以通过传入 File 实例直接从放置事件或文件输入发送文件,但在这种情况下我不能?在我的情况下,读取文件并不会真正削减它,因为在另一端,文件将作为字符串而不是文件(PHP)到达,我无法修改它。感谢您的建议!
  • 据我了解,同样适用。当您将文件粘贴到文件输入中时,您实际上并没有“上传”文件,这只发生在提交表单时,并由浏览器处理。请参阅Using files from web applications - 具体请参阅标题为“示例:显示用户选择的图像的缩略图”的示例。那里显示的代码与上面发布的非常相似。
  • 大概你的 PHP 代码需要将编码后的字符串转换为文件对象like so
  • 是的,我明白你的意思,但是后端代码已经写好了,我不能修改它。但是我不明白为什么我可以将文件从输入或拖放事件附加到 formdata 对象,但我不能从粘贴事件附加文件。
  • 很明显浏览器会读取文件以便发送它,但是从 HTML5 开始你只需给 FormData 一个 File 的实例,这一切都在幕后工作,现在不是这样了吗?跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多