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