Javascript 为什么通过Ajax而不是通过常规Http请求发送文件对象数组是安全的?
我使用HTML表单允许用户上传文件 为了使添加附件更加方便用户,我添加了客户端代码,以允许用户添加/删除文件(我基本上是按照中所述完成的) 因为我不想调整太多服务器端代码,所以我仍然希望在常规请求中发送表单,在服务器上处理表单,并返回Http响应(即:无Ajax,从与主页相同的线程发送请求,然后在我的Javascript 为什么通过Ajax而不是通过常规Http请求发送文件对象数组是安全的?,javascript,jquery,ajax,multipartform-data,form-data,Javascript,Jquery,Ajax,Multipartform Data,Form Data,我使用HTML表单允许用户上传文件 为了使添加附件更加方便用户,我添加了客户端代码,以允许用户添加/删除文件(我基本上是按照中所述完成的) 因为我不想调整太多服务器端代码,所以我仍然希望在常规请求中发送表单,在服务器上处理表单,并返回Http响应(即:无Ajax,从与主页相同的线程发送请求,然后在我的Servlet上重定向或转发响应) 但是,提交对象的唯一方法是通过Ajax。 当我寻找通过常规Http请求发送FormData对象的方法时(例如:将其附加到表单),我听说这是不允许的,因为它不安全
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为这些文件中的每一个添加
元素,但我无法设置其值。因此,发挥创意:让用户选择一个文件,将隐藏的
(其值已设置)移动到
中,然后创建一个新的隐藏文件。(顺便说一句,你的评论说“无法设置其值”比你的编辑更能澄清你的问题)