当前位置: 首页 > 面试题库 >

PHP + JS:如何以HTML形式将文件上传为Content-Type Multipart(通过JS)?

管景天
2023-03-14
问题内容
  1. 具有通过POST提交的HTML表单(用户单击“提交”按钮)。

  2. 此外,还具有通过画布对象的Javascript(getImageData())读取的图像。

题:

如何将该图像数据“注入”到HTML表单中,以便将其作为Content-Type:multipart / form-data上载并可以通过现有的PHP
Frameworks数据提取逻辑进行处理?

<input type="file"CHrome在POST请求中捕获的上传示例=>它应如下所示

------WebKitFormBoundaryBBAQ5B4Ax1NgxFmD
Content-Disposition: form-data; name="images"; filename="fooimage.png"
Content-Type: image/png

问题: 我知道如何在单独的请求中提出要求(通过ajax,与表格分开)。我知道如何将它作为base64数据上载到表单中手动处理。

但是我不知道如何沿着现有表单发送图像数据,以便它查找与通过发送的图像完全相同的PHP服务器端脚本<input type="file"...

原因:Symphony(FileUpload对象)检查文件是否通过POST表单上传,如果我手动使用数据实例化对象,则失败。
因此,最好的解决方案是(关于很多其他事情,例如测试,避免不必要的logik),如果数据将以与常规表单上载相同的方式传递。这个怎么做?

谢谢!


问题答案:

您可以使用FormData对象获取表单的值,然后将画布的Blob版本附加到FormData中。

该斑点将被服务器视为文件。

不幸的是,所有浏览器仍然不支持本机 canvas.toBlob()方法,甚至值得,所有实现都不相同。
现在,所有主要的浏览器都支持toBlob方法,并且您可以在mdn上为较旧的浏览器找到一个 polyfill。

// the function to create and send our FormData
var send = function(form, url, canvas, filename, type, quality, callback) {

  canvas.toBlob(function(blob){
    var formData = form ? new FormData(form) : new FormData();
    formData.append('file', blob, filename);

    var xhr = new XMLHttpRequest();
    xhr.onload = callback;
    xhr.open('POST', url);
    xhr.send(formData);

    }, type, quality);
};

// How to use it //

var form = document.querySelector('form'),   // the form to construct the FormData, can be null or undefined to send only the image
  url = 'http://example.com/upload.php',     // required, the url where we'll send it
  canvas = document.querySelector('canvas'), // required, the canvas to send
  filename = (new Date()).getTime() + '.jpg',// required, a filename
  type = 'image/jpeg',                       // optional, the algorithm to encode the canvas. If omitted defaults to 'image/png'
  quality = .5,                              // optional, if the type is set to jpeg, 0-1 parameter that sets the quality of the encoding
  callback = function(e) {console.log(this.response);}; // optional, a callback once the xhr finished

send(form, url, canvas, filename, type, quality, callback);

PHP方面将是:

if ( isset( $_FILES["file"] ) ){
    $dir = 'some/dir/';
    $blob = file_get_contents($_FILES["file"]['tmp_name']);
    file_put_contents($dir.$_FILES["file"]["name"], $blob);
    }


 类似资料:
  • 我有一个问题,通过我的php网站上传一个mp3文件。它允许我加载2MB以下的所有内容,但没有超过。它以前工作过 托管提供商还增加了fastcgi超时限制。htaccess文件,并添加以下内容:php\u value max\u execution\u time 300, 我们还增加了fastcgi超时限制,并添加了一个。htaccess文件:php\u值上传\u最大\u文件大小20M php\u值

  • 问题内容: 我正在尝试上传以表格形式发送的文件。我正在尝试使用php,但是在html和php之间我使用JS和Jquery和ajax(因为我不想重新加载页面)。我在$ _FILES方面遇到麻烦。 在这里,我正在使用带有javascript操作(action =“ javascript:SendPresupMail();”)的表单(包含文件输入)。 在该JS函数中,我使用了一个小Jquery和ajax

  • 我想增加一个多文件上传按钮到我的申请表格在我的网站。直到现在,我可以一次上传多个文件,并显示这些文件的列表。然而,我现在也想首先上传几个文件,并看到列表,然后我希望能够添加更多的文件,并有该列表停留。但是,到目前为止,当我这样做时,已经上传的文件列表就会消失。这是HTML、CSS和JS代码,我一直使用到现在。如果有人能给我如何在代码中更改这一点的提示,我会很高兴的。 如果我的问题有错误,我很抱歉。

  • 我试图创建一个apache2网页,允许用户上传nifti(. nii,.nii.gz)文件。 我尝试了两种不同的方法: > 在WSL Ubuntu 18.04上,“move_uploaded_文件($_文件[“fileToUpload”][“tmp_名称”],$target_文件)”不返回任何内容。它完全失败了。 在XAMPP上,页面可以获取PDF、JPG..等文件,但不能获取.nii、.exe(

  • 问题内容: 我有这个HTML代码: 我想在字段中写文本。但是,发生此错误: 我发送文本的代码是: 请问你能帮帮我吗? 问题答案: 除了send_keys,我们可以使用以下部分:

  • 无法将文件从Angular客户端上传到Spring Java服务器:Says 400错误http://technology.vishalsrini.com/file-upload-using-angularjs-spring-mvc-restful-service/How to upload file using Angular 2?