无法接收从阿贾克斯到Java的图像,但能够接收图像
问题描述:
的我发送图像到服务器端的字节数。我收到的图像形式为第三方为base64格式,为了减少传输带宽,我将这些数据作为二进制发送(必须进行解码)。请注意我只在服务器端需要这个二进制数据。无法接收从阿贾克斯到Java的图像,但能够接收图像
我现在面临的问题: 考虑一个例子,如果我从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>
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();
}
}
}
我是缺少在这里? 在此先感谢!
答
我可以能够通过传输图像只需按照与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;
}