我正在开发一个网络应用程序,用户在其中选择图像,裁剪它,最后将其上传到服务器。因此,使用 FileUpload 小部件,我允许用户选择图像源,获取其路径并使用构造函数
Image(java.lang.String url, int left, int top, int width, int height);
我得到裁剪的图像对象。
但是现在,我不知道如何将图像上传到服务器。有人知道解决方案吗?
我正在开发一个网络应用程序,用户在其中选择图像,裁剪它,最后将其上传到服务器。因此,使用 FileUpload 小部件,我允许用户选择图像源,获取其路径并使用构造函数
Image(java.lang.String url, int left, int top, int width, int height);
我得到裁剪的图像对象。
但是现在,我不知道如何将图像上传到服务器。有人知道解决方案吗?
您可以在此处找到有关如何将文件上传到服务器的一个很好的示例。
编辑
你需要做的就是将图片上传到服务器,在客户端检索,在客户端进行可视化裁剪,将裁剪参数发送到服务器,最后在服务器进行实际裁剪。这就是我从上面提到的项目开始的方式:
vPanel.add(new Button("Submit", new ClickHandler() {
public void onClick(ClickEvent event) {
form.submit();
}
}));
一旦用户选择了一张图片,我们使用 FileUpload 上传它,并在服务器中将它保存在一个目录中:
List<FileItem> items = fileUpload.parseRequest(request);
Iterator<FileItem> iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
File file = new File(<images-path>,fileName);
Streams.copy(item.getInputStream(),new FileOutputStream(file), true);
}
我们需要一个服务来检索上传的图像,所以我们添加一个 servlet,它采用 get 方法并返回一个图像:
protected void doGet(HttpServletRequest req,
HttpServletResponse resp) throws ServletException,
IOException
{
resp.setContentType("image/jpeg");
ServletOutputStream out = resp.getOutputStream();
BufferedInputStream bis= new BufferedInputStream(new FileInputStream(<images-path>+req.getParameter("name")));
BufferedOutputStream bos = new BufferedOutputStream(resp.getOutputStream());
int ch;
while((ch=bis.read())!=-1)
{
bos.write(ch);
}
bis.close();
bos.flush();
bos.close();
out.close();
}
上传完成后返回客户端,我们想要检索上传图像的副本,因此我们添加了一个表单提交处理程序。我正在使用这个gwt 裁剪库进行可视化步骤:
form.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler()
{
public void onSubmitComplete(SubmitCompleteEvent event)
{
Element label = DOM.createLabel();
label.setInnerHTML(event.getResults());
String result = label.getInnerText(); // result contains the name of the image in the server
final GWTCropper crop = new GWTCropper(GWT.getModuleBaseURL()+"image?name="+result);
crop.setAspectRatio(1);
vPanel.add(crop);
}
}
现在我们必须添加一个裁剪服务,让实际的裁剪发生在我使用 RCP 服务的服务器上:
public class CropServiceImpl extends RemoteServiceServlet implements CropService {
public Boolean crop(String name, int x, int y, int width, int height)
{
try
{
BufferedImage outImage = ImageIO.read(new File("<images-path>"+name));
BufferedImage cropped = outImage.getSubimage(x, y, width, height);
ImageIO.write(cropped, "jpg", new File("<images-path>","cropped"+name));
return true;
}
catch (IOException e)
{
e.printStackTrace();
}
return false;
}
}
最后,回到客户端,我们使用从裁剪中获得的参数调用按钮操作中的方法:
vPanel.add(new Button("Crop", new ClickHandler()
{
public void onClick(ClickEvent event)
{
cropService.crop(getName(), (int) crop.getSelectionXCoordinate(),
(int) crop.getSelectionYCoordinate(), (int) crop.getSelectionWidth(),
(int) crop.getSelectionHeight(), new AsyncCallback<Boolean>()
{
public void onFailure(Throwable arg0)
{
// something went wrong with the call
}
public void onSuccess(Boolean arg0)
{
if (arg0)
{
// the cropped file now lives in the server
}
else
{
// an error happened in the server
}
}
});
}
}));
你去了,对不起,很长的帖子,希望它有帮助。