javascript 发送 post 参数和文件
javascript send post parameters with file
尝试上传带有某些参数的文件,我已将 Ext upload plugin
更改为上传带有 post 参数的文件。
ext uploader
代码(ux.upload.uploader.FormDataUploader):
uploadItem : function(item) {
file = item.getFileApiObject();
item.setUploading();
formData = new FormData();
// mycode goes here to append some parameters
formData.append(file.name, file);
xhr = this.initConnection();
xhr.setRequestHeader(this.filenameHeader, file.name);
xhr.setRequestHeader(this.sizeHeader, file.size);
xhr.setRequestHeader(this.typeHeader, file.type);
var loadendhandler = Ext.Function.bind(this.onLoadEnd, this, [
item
], true);
var progresshandler = Ext.Function.bind(this.onUploadProgress, this, [
item
], true);
xhr.addEventListener('loadend', loadendhandler, true);
xhr.upload.addEventListener("progress", progresshandler, true);
xhr.send(formData);
},
initConnection : function() {
var xhr = new XMLHttpRequest(),
method = this.method,
url = this.url;
xhr.open(method, url, true);
this.abortXhr = function() {
this.suspendEvents();
xhr.abort();
this.resumeEvents();
};
return xhr;
},
我尝试了这两行代码:
formData.append("ali","ghasemi");
formData.append("alisd","ghassdf");
但是参数是按以下方式添加到请求负载中的:
------WebKitFormBoundarylAKSY21NN15kqWct
Content-Disposition: form-data; name="ali"
ghasemi
------WebKitFormBoundarylAKSY21NN15kqWct
Content-Disposition: form-data; name="alisd"
ghassdf
------WebKitFormBoundarylAKSY21NN15kqWct
Content-Disposition: form-data; name="icon-info.gif"; filename="icon-info.gif"
Content-Type: image/gif
GIF89a
如何在服务器端获取 post
参数或如何在客户端正确设置这些参数?
我正在 java spring 编码。 HttpServletRequest
不知道这些参数。
public JSONObject upload(HttpServletRequest request, HttpServletResponse response, @RequestBody String body) throws IOException {
String ali = request.getParameter("ali"); // returns null
}
任何 Ext 或纯 java 脚本或 Java spring controller
的答案将不胜感激。
这是一个相关问题:formdata-appendkey-value-is-not-working
你粘贴的request payload是正确的FormData格式,我们也说multipart/form-data。
在php中:
您可以使用 $_POST 获取这些参数,例如 ali、alisd。
并使用 $_FILES 获取上传文件。
我找到了答案here。
multipart/form-data 3.0 版之前的 Servlet API 确实默认不支持编码请求。 Servlet API 默认使用 application/x-www-form-urlencoded
编码解析参数。当使用不同的编码时,request.getParameter()
调用将全部 return null
。如果您已经在使用 Servlet 3.0(Glassfish 3、Tomcat 7 等),那么您可以改用 HttpServletRequest#getParts()
。另请参阅此博客以获取更多示例。
在 Servlet 3.0 之前,解析 multipart/form-data
请求的实际标准是使用 Apache Commons FileUpload。只需仔细阅读其用户指南和常见问题解答部分即可了解如何使用它。我之前在这里发布了一个带有代码示例的答案(它还包含一个针对 Servlet 3.0 的示例)。
java代码:
Map properties = new HashMap();
List<FileItem> items;
items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
for (FileItem item : items) {
if (item.isFormField()) {
String fieldName = item.getFieldName();
String fieldValue = item.getString();
properties.put(fieldName, fieldValue);
} else {
String tempString = "d:/io";
//String fileName = FilenameUtils.getName(item.getName());
//fileNameWithOutExt = FilenameUtils.removeExtension(fileName);
file = new File(tempString + '/' + item.getName());
item.write(file);
}
}
尝试上传带有某些参数的文件,我已将 Ext upload plugin
更改为上传带有 post 参数的文件。
ext uploader
代码(ux.upload.uploader.FormDataUploader):
uploadItem : function(item) {
file = item.getFileApiObject();
item.setUploading();
formData = new FormData();
// mycode goes here to append some parameters
formData.append(file.name, file);
xhr = this.initConnection();
xhr.setRequestHeader(this.filenameHeader, file.name);
xhr.setRequestHeader(this.sizeHeader, file.size);
xhr.setRequestHeader(this.typeHeader, file.type);
var loadendhandler = Ext.Function.bind(this.onLoadEnd, this, [
item
], true);
var progresshandler = Ext.Function.bind(this.onUploadProgress, this, [
item
], true);
xhr.addEventListener('loadend', loadendhandler, true);
xhr.upload.addEventListener("progress", progresshandler, true);
xhr.send(formData);
},
initConnection : function() {
var xhr = new XMLHttpRequest(),
method = this.method,
url = this.url;
xhr.open(method, url, true);
this.abortXhr = function() {
this.suspendEvents();
xhr.abort();
this.resumeEvents();
};
return xhr;
},
我尝试了这两行代码:
formData.append("ali","ghasemi");
formData.append("alisd","ghassdf");
但是参数是按以下方式添加到请求负载中的:
------WebKitFormBoundarylAKSY21NN15kqWct
Content-Disposition: form-data; name="ali"
ghasemi
------WebKitFormBoundarylAKSY21NN15kqWct
Content-Disposition: form-data; name="alisd"
ghassdf
------WebKitFormBoundarylAKSY21NN15kqWct
Content-Disposition: form-data; name="icon-info.gif"; filename="icon-info.gif"
Content-Type: image/gif
GIF89a
如何在服务器端获取 post
参数或如何在客户端正确设置这些参数?
我正在 java spring 编码。 HttpServletRequest
不知道这些参数。
public JSONObject upload(HttpServletRequest request, HttpServletResponse response, @RequestBody String body) throws IOException {
String ali = request.getParameter("ali"); // returns null
}
任何 Ext 或纯 java 脚本或 Java spring controller
的答案将不胜感激。
这是一个相关问题:formdata-appendkey-value-is-not-working
你粘贴的request payload是正确的FormData格式,我们也说multipart/form-data。
在php中: 您可以使用 $_POST 获取这些参数,例如 ali、alisd。 并使用 $_FILES 获取上传文件。
我找到了答案here。
multipart/form-data 3.0 版之前的 Servlet API 确实默认不支持编码请求。 Servlet API 默认使用 application/x-www-form-urlencoded
编码解析参数。当使用不同的编码时,request.getParameter()
调用将全部 return null
。如果您已经在使用 Servlet 3.0(Glassfish 3、Tomcat 7 等),那么您可以改用 HttpServletRequest#getParts()
。另请参阅此博客以获取更多示例。
在 Servlet 3.0 之前,解析 multipart/form-data
请求的实际标准是使用 Apache Commons FileUpload。只需仔细阅读其用户指南和常见问题解答部分即可了解如何使用它。我之前在这里发布了一个带有代码示例的答案(它还包含一个针对 Servlet 3.0 的示例)。
java代码:
Map properties = new HashMap();
List<FileItem> items;
items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
for (FileItem item : items) {
if (item.isFormField()) {
String fieldName = item.getFieldName();
String fieldValue = item.getString();
properties.put(fieldName, fieldValue);
} else {
String tempString = "d:/io";
//String fileName = FilenameUtils.getName(item.getName());
//fileNameWithOutExt = FilenameUtils.removeExtension(fileName);
file = new File(tempString + '/' + item.getName());
item.write(file);
}
}