Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.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接收到java,但能够接收图像的字节_Javascript_Java_Jquery_Ajax_Base64 - Fatal编程技术网

Javascript 无法作为图像从ajax接收到java,但能够接收图像的字节

Javascript 无法作为图像从ajax接收到java,但能够接收图像的字节,javascript,java,jquery,ajax,base64,Javascript,Java,Jquery,Ajax,Base64,我正在向服务器端发送一个映像。我从第三方接收的图像为base64格式,为了减少传输带宽,我将此数据作为二进制文件发送(必须解码)。请注意,我需要这个作为二进制数据只在服务器端 我面临的问题是: 考虑一个例子,如果我从JS发送5KB文件到java。我能够接收并查看保存文件的位置。但该文件似乎已损坏,无法在ms paint或任何其他图像应用程序中打开。 我可以在java调试器上看到以字节为单位的表单(图像)项! 我已经尝试了以下代码很多,我无法找到什么是真正的问题 JSP代码: function o

我正在向服务器端发送一个映像。我从第三方接收的图像为base64格式,为了减少传输带宽,我将此数据作为二进制文件发送(必须解码)。请注意,我需要这个作为二进制数据只在服务器端

我面临的问题是: 考虑一个例子,如果我从JS发送5KB文件到java。我能够接收并查看保存文件的位置。但该文件似乎已损坏,无法在ms paint或任何其他图像应用程序中打开。 我可以在java调试器上看到以字节为单位的表单(图像)项! 我已经尝试了以下代码很多,我无法找到什么是真正的问题

JSP代码:

function oneMore(){
var base64ImageData = "/9j/4AAQSkZJRgABAQEAYABgAAD/2wCEAA0JCgsKCA"
var converted = Base64.decode(base64ImageData);
//(this is just an sample)
    var formdata = new FormData();
        formdata.append("image", converted);

        /* var formdata = new FormData();
        formdata.append("image", image); */
        $.ajax({
            url : '/RegisterServlet_2/servlet/Register',
            type : "POST",
            data : formdata,
            enctype : 'multipart/form-data',
            processData : false,
            contentType : false
        }).done(function(data)
        {
            alert('File upload completed ...');
        }).fail(function(jqXHR, textStatus)
        {
            alert('File upload failed ...');
        });
    }
</script>

</head>
<body >
    <input type="button" id="testId" name="testName" value="Tester" onclick="oneMore();">
</body>
函数oneMore(){
var base64ImageData=“/9j/4AAQSkZJRgABAQEAYABgAAD/2wCEAA0JCgsKCA”
var converted=Base64.decode(base64ImageData);
//(这只是一个样本)
var formdata=new formdata();
formdata.append(“图像”,已转换);
/*var formdata=new formdata();
formdata.append(“图像”,图像)*/
$.ajax({
url:“/RegisterServlet_2/servlet/Register”,
类型:“POST”,
数据:formdata,
enctype:“多部分/表单数据”,
processData:false,
contentType:false
}).完成(功能(数据)
{
警报('文件上载完成…');
}).fail(函数(jqXHR,textStatus)
{
警报('文件上载失败…');
});
}
java方面:

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class Register extends HttpServlet
{
    private static final long serialVersionUID = -4562252992447370243L;

    // location to store file uploaded
    private static final String UPLOAD_DIRECTORY = "D:/";

    // upload settings
    private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3; // 3MB
    private static final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB
    private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 50; // 50MB

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    { 
        // checks if the request actually contains upload file
        if (!ServletFileUpload.isMultipartContent(request))
            return;

        // configures upload settings
        DiskFileItemFactory factory = new DiskFileItemFactory();
        // sets memory threshold - beyond which files are stored in disk
        factory.setSizeThreshold(MEMORY_THRESHOLD);
        // sets temporary location to store files
        factory.setRepository(new File(System.getProperty("catalina.base"), "temp"));
        System.out.println(factory.getRepository());

        ServletFileUpload upload = new ServletFileUpload(factory);

        // sets maximum size of upload file
        upload.setFileSizeMax(MAX_FILE_SIZE);

        // sets maximum size of request (include file + form data)
        upload.setSizeMax(MAX_REQUEST_SIZE);

        // constructs the directory path to store upload file
        // this path is relative to application's directory
        String uploadPath = UPLOAD_DIRECTORY;

        try
        {
            // parses the request's content to extract file data
            @SuppressWarnings("unchecked")
            List<FileItem> formItems = upload.parseRequest(request);

            if (formItems != null && formItems.size() > 0)
            {
                // iterates over form's fields
                for (FileItem item : formItems)
                {
                    if(item==null)
                        continue;

                    String filePath = uploadPath + File.separator + "Image" + System.currentTimeMillis() + ".jpg";
                    File storeFile = new File(filePath);
                    System.out.println(storeFile);

                    // saves the file on disk
                    item.write(storeFile);

                    InputStream is = item.getInputStream();
                    BufferedImage image = ImageIO.read(is);

                    ImageIO.write(image, "jpg", storeFile);



                }
            }
        } catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
}
导入java.awt.Image;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.util.List;
导入javax.imageio.imageio;
导入javax.servlet.ServletException;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入org.apache.commons.fileupload.FileItem;
导入org.apache.commons.fileupload.disk.DiskFileItemFactory;
导入org.apache.commons.fileupload.servlet.ServletFileUpload;
公共类寄存器扩展HttpServlet
{
私有静态最终长serialVersionUID=-456252992447370243L;
//存储上载文件的位置
私有静态最终字符串上传_DIRECTORY=“D:/”;
//上载设置
私有静态最终整数内存\u阈值=1024*1024*3;//3MB
私有静态最终int MAX_FILE_SIZE=1024*1024*40;//40MB
私有静态final int MAX_REQUEST_SIZE=1024*1024*50;//50MB
public void doPost(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException
{ 
//检查请求是否确实包含上载文件
如果(!ServletFileUpload.isMultipartContent(请求))
返回;
//配置上载设置
DiskFileItemFactory=新的DiskFileItemFactory();
//设置内存阈值-超过该阈值,文件将存储在磁盘中
设置SizeThreshold(内存_阈值);
//设置存储文件的临时位置
setRepository(新文件(System.getProperty(“catalina.base”),“temp”);
System.out.println(factory.getRepository());
ServletFileUpload upload=新的ServletFileUpload(工厂);
//设置上载文件的最大大小
upload.setFileSizeMax(最大文件大小);
//设置请求的最大大小(包括文件+表单数据)
upload.setSizeMax(最大请求大小);
//构造用于存储上载文件的目录路径
//此路径相对于应用程序的目录
String uploadPath=上传目录;
尝试
{
//解析请求的内容以提取文件数据
@抑制警告(“未选中”)
List formItems=upload.parseRequest(请求);
if(formItems!=null&&formItems.size()>0)
{
//迭代窗体的字段
用于(文件项:表单项)
{
如果(项==null)
继续;
字符串filePath=uploadPath+File.separator+“Image”+System.currentTimeMillis()+“.jpg”;
文件存储文件=新文件(文件路径);
System.out.println(存储文件);
//将文件保存在磁盘上
item.write(存储文件);
InputStream=item.getInputStream();
BuffereImage image=ImageIO.read(is);
write(图像,“jpg”,存储文件);
}
}
}捕获(例外情况除外)
{
例如printStackTrace();
}
}
}

我错过了什么?
提前谢谢

我可以通过blob转换简单地遵循java脚本中的更改来传输图像:

function oneMore()

{
    var base64ImageData = "/9j/4AAQSkZJRgABAQEAYABgAAD/2wCEAA0JCgs"
    var formData = reduceImgTransferBandwidth(base64ImageData);

  //   debugger;
    $.ajax({
        url : '/RegisterServlet_2/servlet/Register',
        type : "POST",
        data : formData,
           enctype: 'multipart/form-data',
        processData : false,
        contentType : false
    }).done(function(data)
    {
        //alert('File upload completed ...');
    }).fail(function(jqXHR, textStatus)
    {
        //alert('File upload failed ...');
    });
}



    function reduceImgTransferBandwidth(pimagedata)
    {
        var form = document.createElement("myForm");
        var ImageURL = "data:image/gif;base64," + pimagedata;
        var block = ImageURL.split(";");
        var contentType = block[0].split(":")[1];
        var realData = block[1].split(",")[1];
        var blob = b64toBlob(realData, contentType);
        var formDataToUpload = new FormData(form);

        formDataToUpload.append("image", blob);

        return formDataToUpload;

    }

    function b64toBlob(b64Data, contentType, sliceSize)
    {
        contentType = contentType || '';
        sliceSize = sliceSize || 512;

        var byteCharacters = atob(b64Data);
        var byteArrays = [];

        for (var offset = 0; offset < byteCharacters.length; offset += sliceSize)
        {
            var slice = byteCharacters.slice(offset, offset + sliceSize);

            var byteNumbers = new Array(slice.length);
            for (var i = 0; i < slice.length; i++)
            {
                byteNumbers[i] = slice.charCodeAt(i);
            }

            var byteArray = new Uint8Array(byteNumbers);

            byteArrays.push(byteArray);
        }

        var blob = new Blob(byteArrays, {
            type : contentType
        });
        return blob;
    }
函数oneMore()
{
var base64ImageData=“/9j/4AAQSkZJRgABAQEAYABgAAD/2wCEAA0JCgs”
var formData=reduceImgTransferBandwidth(base64ImageData);
//调试器;
$.ajax({
url:“/RegisterServlet_2/servlet/Register”,
类型:“POST”,
数据:formData,
enctype:“多部分/表单数据”,
processData:false,
contentType:false
}).完成(功能(数据)
{
//警报('文件上载完成…');
}).fail(函数(jqXHR,textStatus)
{
//警报('文件上载失败…');
});
}
函数reduceImgTransferBandwidth(pimagedata)
{
var form=document.createElement(“myForm”);
var ImageURL=“data:image/gif;base64,”+pimagedata;
var block=ImageURL.split(“;”);
var contentType=block[0]。拆分(“:”[1];
var realData=block[1]。拆分(“,”[1];
var blob=b64toBlob(realData,contentType);
var formDataToUpload=新表单数据(表单);
formDataToUpload.append(“图像”,blob);
返回formDataToUpload;