使用valums ajax upload和OctetStreamReader dosn';t在IE-Java/JSP中工作

使用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

我在Internet Explorer 7、8和9中上传图片时遇到问题(尚未测试其他版本)。它在FF和Chrome中运行良好,但由于某些原因,当我尝试在任何版本的IE中上传图片时,图片上传错误

我的意思是,该文件被上传到正确的目录和正确的名称,但我不能在任何图片编辑程序中打开它

此外,当我在Notepad++中打开图片时,我看到图片显示了一些元数据,如:

-----------------------------7db1f6c907fe 内容配置:表单数据;name=“qqfile”;filename=“jingjang.jpg” 内容类型:图像/jpeg

(这里是hashcode)

-----------------------------7db1f6c907fe--

如果我删除代码,图片就可以了!那么,有人能告诉我是什么在生成代码,以及如何停止它吗?:)

我在JSP页面上使用Valums Ajax上载:

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();
        }