gpt4 book ai didi

java - Servlet 与文件系统交互 : storing files and generating URLs for clientside access

转载 作者:行者123 更新时间:2023-11-30 04:46:41 25 4
gpt4 key购买 nike

摘要

  1. 我需要存储上传的图像和服务器生成的图像,并使用可移植和可预测的路径,因此我的服务器代码知道这些图像存在的位置。
  2. 我需要生成这些图像的 URL,以便发送给客户端。这些 URL 将在 HTML 图像元素中使用。

问题

我的 Web 应用程序允许用户使用 gwtupload(Apache Commons) 上传图像。该图像存储在服务器上,并向客户端返回一个 URL,以便显示该图像。 gwtupload 提供了一个客户端方法来获取上传图像的 URL。这在部署中有效;以下几个方面没有:

  • 在某些情况下,必须裁剪上传的图像。这导致由 servlet 方法生成的新图像。我想保存这个裁剪图像并返回(给客户端)访问 URL。
  • 然后,该图像被另一种方法使用来生成另一个图像。此方法必须知道文件系统上的位置之前上传(和/或裁剪)的图像。新版本的 URL然后必须将图像返回给客户端。

我的实现在 GWT 开发模式下完美运行。然而,正如我所料,部署到我自己的Tomcat服务器后,由于我对文件系统的困惑,远程服务失败了。我不知道将这些图像存储在服务器文件系统上可预测位置的正确方法,也不知道如何生成访问 URL(对于驻留在 WAR 之外的文件,就像这些图像一样。)

所有这些图像仅在当前 session 中需要,因此位置可以是临时目录。我花了两天时间尝试并在网上寻找解决方案,但没有成功。

我将在下面发布删节代码。这是我尝试简单地使用工作目录和相对路径名。使用附加到 servlet 容器的 Eclipse 调试器,我可以看到 String dataDir = context.getRealPath("foo") 的结果,指示 servlet 内的临时文件夹:但是当我使用资源管理器导航到那里时,没有写入任何文件到磁盘。我很困惑。

public String[] generatePreview(String xml) {

PreviewManager manager = new PreviewManager();
String url;

try{
preview = manager.generatePreview(xml);
}
catch (Exception e){e.printStackTrace();}

//Create the preview directory
File folder = new File("previews");
if (!folder.exists()) folder.mkdir();

//The file to be written to
File output = new File(folder, "front.jpg");

ServletContext context = getServletContext();
String dataDir = context.getRealPath("previews");

try {
ImageIO.write(image, "jpg", output);
} catch (IOException e) {
e.printStackTrace();
}

url = "previews/" + output.getName();

return url;
}

@Override
public String cropBackground(int[] coord_pair, String relativePath) {

File backgroundsFolder = new File("backgrounds");
if (!backgroundsFolder.exists()) backgroundsFolder.mkdir();

ServletContext context = getServletContext();
String dataDir = context.getRealPath("backgrounds");

File current = new File(relativePath);
String croppedName = "cropped_" + relativePath.replace("./backgrounds/", "");

int x = coord_pair[0];
int y = coord_pair[1];
int width = coord_pair[2];
int height = coord_pair[3];
String croppedPath = null;

try {
croppedPath = imageCropper.createCroppedImage(current, "backgrounds", croppedName, x, y, width, height);
}
catch (IOException e){
e.printStackTrace();
}

current.delete();
return "backgrounds/" + croppedPath;

我知道我当前的“返回”语句在部署中永远无法工作:我需要正确生成 URL 并作为字符串返回。我对问题的长度感到抱歉,但我想弄清楚我的问题。

最佳答案

选择 Tomcat 外部存储图像的目录。为每个上传或生成的图像分配一些唯一的ID,并将图像存储在该目录中(例如以ID作为文件名)。

生成图像 servlet 的 URL,该 servlet 将通过此目录中的 ID 读取图像,并将图像的字节发送到 servlet 响应的输出流:image.action?id=theImageId .

关于java - Servlet 与文件系统交互 : storing files and generating URLs for clientside access,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10835857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com