使用valums ajax upload和OctetStreamReader dosn';t在IE-Java/JSP中工作
我在Internet Explorer 7、8和9中上传图片时遇到问题(尚未测试其他版本)。它在FF和Chrome中运行良好,但由于某些原因,当我尝试在任何版本的IE中上传图片时,图片上传错误 我的意思是,该文件被上传到正确的目录和正确的名称,但我不能在任何图片编辑程序中打开它 此外,当我在Notepad++中打开图片时,我看到图片显示了一些元数据,如: -----------------------------7db1f6c907fe 内容配置:表单数据;name=“qqfile”;filename=“jingjang.jpg” 内容类型:图像/jpeg (这里是hashcode) -----------------------------7db1f6c907fe-- 如果我删除代码,图片就可以了!那么,有人能告诉我是什么在生成代码,以及如何停止它吗?:) 我在JSP页面上使用Valums Ajax上载:使用valums ajax upload和OctetStreamReader dosn';t在IE-Java/JSP中工作,java,ajax,servlets,file-upload,Java,Ajax,Servlets,File Upload,我在Internet Explorer 7、8和9中上传图片时遇到问题(尚未测试其他版本)。它在FF和Chrome中运行良好,但由于某些原因,当我尝试在任何版本的IE中上传图片时,图片上传错误 我的意思是,该文件被上传到正确的目录和正确的名称,但我不能在任何图片编辑程序中打开它 此外,当我在Notepad++中打开图片时,我看到图片显示了一些元数据,如: -----------------------------7db1f6c907fe 内容配置:表单数据;name=“qqfile”;filen
var imageFolder = "images/upload/<%=user.getUsername()%>/temp/";
new qq.FileUploader({
element: document.getElementById('TempUploadButton'),
action: 'OctetStreamReader',
debug: false,
multiple: false,
params: {"type" : "user"},
onComplete: function(id, fileName) {
var d = new Date();
$("#UserPageAvatarPic a img").attr("src", imageFolder+"<%=user.getUsername()%>.jpg?cache="+d.getTime() );
},
onSubmit : function(id, fileName) {
// hide all prev elements
$('#TempUploadButton ul.qq-upload-list li').each(function() {
$(this).hide();
});
}
});
同样在fileuploader.js中,我尝试将内容类型从application/octet流更改为multipart/form数据
/**
* Sends the file identified by id and additional query params to the server
* @param {Object} params name-value string pairs
*/
_upload: function(id, params){
var file = this._files[id],
name = this.getName(id),
size = this.getSize(id);
this._loaded[id] = 0;
var xhr = this._xhrs[id] = new XMLHttpRequest();
var self = this;
xhr.upload.onprogress = function(e){
if (e.lengthComputable){
self._loaded[id] = e.loaded;
self._options.onProgress(id, name, e.loaded, e.total);
}
};
xhr.onreadystatechange = function(){
if (xhr.readyState == 4){
self._onComplete(id, xhr);
}
};
// build query string
params = params || {};
params['qqfile'] = name;
var queryString = qq.obj2url(params, this._options.action);
xhr.open("POST", queryString, true);
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhr.setRequestHeader("X-File-Name", encodeURIComponent(name));
xhr.setRequestHeader("Content-Type", "multipart/form-data");
xhr.send(file);
},
默认情况下使用HTML文件上载(这是为了能够上载多个文件和/或在one请求中混合正常输入字段值)。但是,您并不是从请求体中解析和提取单个表单数据部分,而是将整个请求体读写到一个文件中,而不做任何修改
is = request.getInputStream();
fos = new FileOutputStream(new File(realPath + "/" + filename), false);
IOUtils.copy(is, fos);
这确实是行不通的。你说它在FF/Chrome中工作,我无法理解。也许您误解了结果,或者根本没有在那些使用二进制文件的浏览器中对其进行测试
您需要使用从多部分/表单数据请求中提取部分。或者,当您已经使用Servlet3.0时,也可以使用ServletAPI提供的方法
另见:
与具体问题无关到目前为止发布的代码还有另一个问题。您将上传的文件存储在扩展战争的web内容中。这离固定的永久存储位置很远。每次你重新部署一场新的战争,所有的文件都会丢失。您需要每次备份它们,这显然是笨拙和容易出错的。而是将它们存储在扩展WAR文件夹外的固定位置
另见:
使用以下方法:
InputStream is = null;
// Check that we have a file upload request
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
// Create a factory for disk-based file items
if (isMultipart) {
FileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
try {
// Parse the request
ArrayList<DiskFileItem> files = (ArrayList<DiskFileItem>) upload.parseRequest(request);
if (!files.isEmpty()) {
is = files.get(0).getInputStream();
}
} catch (FileUploadException ex) {
Logger.getLogger(OctetStreamReader.class.getName()).log(Level.SEVERE, null, ex);
}
} else {
is = request.getInputStream();
}
InputStream=null;
//检查我们是否有文件上传请求
布尔值isMultipart=ServletFileUpload.isMultipartContent(请求);
//为基于磁盘的文件项创建工厂
if(isMultipart){
FileItemFactory=new DiskFileItemFactory();
//创建新的文件上载处理程序
ServletFileUpload upload=新的ServletFileUpload(工厂);
试一试{
//解析请求
ArrayList文件=(ArrayList)upload.parseRequest(请求);
如果(!files.isEmpty()){
is=files.get(0.getInputStream();
}
}catch(FileUploadException-ex){
Logger.getLogger(OctetStreamReader.class.getName()).log(Level.SEVERE,null,ex);
}
}否则{
is=request.getInputStream();
}
谢谢您的回答。我不太明白你的意思,为什么我这样做是行不通的。我从valums主页获得了OctetStreamReader.java以及整个软件包,只是对它做了一点修改:我还尝试使用Apache Commons FileUpload,当我使用提交图片和表单时效果很好:但它与Ajax上传程序不兼容,我之前需要动态图片上传提交整个表格。这就是为什么我试图回到这个话题
InputStream is = null;
// Check that we have a file upload request
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
// Create a factory for disk-based file items
if (isMultipart) {
FileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
try {
// Parse the request
ArrayList<DiskFileItem> files = (ArrayList<DiskFileItem>) upload.parseRequest(request);
if (!files.isEmpty()) {
is = files.get(0).getInputStream();
}
} catch (FileUploadException ex) {
Logger.getLogger(OctetStreamReader.class.getName()).log(Level.SEVERE, null, ex);
}
} else {
is = request.getInputStream();
}