まとめ
- サーバーコードがこれらの画像の存在を認識できるように、アップロードされた画像とサーバーで生成された画像の両方を、ポータブルで予測可能なパスとともに保存する必要があります。
- クライアントに送信できるこれらの画像へのURLを生成する必要があります。これらのURLは、HTML画像要素で使用されます。
問題
私のWebアプリケーションでは、ユーザーはgwtupload(Apache Commons)を使用して画像をアップロードできます。この画像はサーバーに保存され、URLがクライアントに返されるため、画像が表示されます。gwtuploadは、アップロードされた画像のこのURLを取得するためのクライアントサイドメソッドを提供します。これは展開で機能します。次の側面はしません:
- 場合によっては、アップロードされた画像をトリミングする必要があります。これにより、サーブレットメソッドによって新しいイメージが生成されます。このトリミングされた画像を保存し、アクセスURLを(クライアントに)返したいです。
- 次に、この画像を別の方法で使用して別の画像を生成します。このメソッドは、以前にアップロードされた(および/またはトリミングされた)画像のファイルシステム上の場所を知っている必要があります。次に、新しい画像のURLをクライアントに返す必要があります。
GWT開発モードで完全に機能する実装があります。しかし、予想通り、自分のTomcatサーバーにデプロイした後、ファイルシステムに関する混乱のためにリモートサービスが失敗しました。これらの画像をサーバーファイルシステムの予測可能な場所に保存する正しい方法も、アクセスURLを生成する方法もわかりません(これらの画像のように、WARに存在するファイルの場合)。
これらのイメージはすべて現在のセッションにのみ必要であるため、場所は一時ディレクトリにすることができます。私は2日間、無駄な解決策を探すためにWebの実験とトロールを行いました。
以下に要約コードを掲載します。これは、作業ディレクトリと相対パス名を単純に使用するための私の試みです。サーブレットコンテナに接続されたEclipseデバッガを使用すると、サーブレット内の一時フォルダを示すString dataDir = context.getRealPath( "foo")の結果を確認できました。ただし、エクスプローラを使用してそこに移動すると、ファイルが書き込まれていませんでした。ディスクに。私は非常に混乱しています。
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;
現在の「return」ステートメントはデプロイメントでは機能しないことを認識しています。URLを適切に生成し、文字列として返す必要があります。質問の長さについては申し訳ありませんが、問題を明確にしたいと思いました。