Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么通过Ajax而不是通过常规Http请求发送文件对象数组是安全的?_Javascript_Jquery_Ajax_Multipartform Data_Form Data - Fatal编程技术网

Javascript 为什么通过Ajax而不是通过常规Http请求发送文件对象数组是安全的?

Javascript 为什么通过Ajax而不是通过常规Http请求发送文件对象数组是安全的?,javascript,jquery,ajax,multipartform-data,form-data,Javascript,Jquery,Ajax,Multipartform Data,Form Data,我使用HTML表单允许用户上传文件 为了使添加附件更加方便用户,我添加了客户端代码,以允许用户添加/删除文件(我基本上是按照中所述完成的) 因为我不想调整太多服务器端代码,所以我仍然希望在常规请求中发送表单,在服务器上处理表单,并返回Http响应(即:无Ajax,从与主页相同的线程发送请求,然后在我的Servlet上重定向或转发响应) 但是,提交对象的唯一方法是通过Ajax。 当我寻找通过常规Http请求发送FormData对象的方法时(例如:将其附加到表单),我听说这是不允许的,因为它不安全

我使用HTML表单允许用户上传文件

为了使添加附件更加方便用户,我添加了客户端代码,以允许用户添加/删除文件(我基本上是按照中所述完成的)

因为我不想调整太多服务器端代码,所以我仍然希望在常规请求中发送表单,在服务器上处理表单,并返回Http响应(即:无Ajax,从与主页相同的线程发送请求,然后在我的
Servlet
上重定向或转发响应)

但是,提交对象的唯一方法是通过Ajax。 当我寻找通过常规Http请求发送
FormData
对象的方法时(例如:将其附加到表单),我听说这是不允许的,因为它不安全

为什么可以通过
XMLHttpRequest
提交
FormData
,但通过常规Http请求(如常规表单提交)提交对用户来说是不安全的?有什么区别? 换一种说法:如果您通过
Ajax
提交附件,而不是通过常规请求提交附件,那么您可能会弄乱附件。为什么?

如果有办法定期提交
FormData
,我很想知道它是什么

谢谢

额外澄清(由评论引起):

表单上的输入元素不能准确表示用户的选择。我允许用户添加/删除文件。我通过在客户端代码中创建自己的
File
对象的
Array
来实现这一点。这个新的
文件
对象数组需要与请求一起发送。这可以通过Ajax实现(即:通过创建
FormData
对象),而不是常规表单提交;为什么?

提交FormData对象的唯一方法是通过Ajax

事实并非如此

FormData
对象只是在传输之前对二进制数据进行编码的一种方式(有关其用途的完整概述,请参阅)。只有在将文件(即二进制数据)发送到服务器时才真正需要它

如果要在没有AJAX的情况下完成此操作,请将
enctype=“multipart/form data”
属性添加到
form
元素中,并像往常一样提交它


还要注意,正如您的问题标题所暗示的那样,
FormData
的使用与安全性无关。

如何将
FormData
对象附加到表单?我在客户端代码中创建了
FormData
对象。
表单
还不知道。您不需要知道。对于AJAX请求,您只需手动构建
FormData
。如果您不想(或不需要)使用AJAX,那么只需将我上面提到的
enctype
属性添加到
中,浏览器就会在提交之前为您编码数据。请阅读问题的第二段(包括链接)。
表单
上的
输入
元素不能准确表示用户的选择。我允许用户添加/删除文件。我通过在客户端代码中创建自己的
File
对象的
Array
来实现这一点。这个新的
文件
对象数组需要与请求一起发送。这在Ajax中是可能的,而不是在常规表单提交中;为什么?
FormData
用于基于
创建对象,然后可以通过AJAX发送该对象。如果您想以非Ajax方式发送文件,首先不要创建FormData对象。您所要做的就是在表单中添加
s。不确定问题出在哪里,tbh。我正在创建自己的
文件
对象数组。请阅读第二段(包括链接),我知道你想做什么;我的建议是使用数组方法,然后基于它们构建
并将它们添加到
中,而不是构建FormData对象并通过AJAX发送。添加
元素没有问题,但是如何将
文件
对象设置为它们?据我所知,这是不可能的。。。再次回顾一下,我有一个
数组
文件
对象。我当然可以使用javascript为这些
文件中的每一个添加
元素,但我无法设置其值。因此,发挥创意:让用户选择一个文件,将隐藏的
(其值已设置)移动到
中,然后创建一个新的隐藏文件。(顺便说一句,你的评论说“无法设置其值”比你的编辑更能澄清你的问题)