2

私の考えは、ユーザーが次のようにコンテキストパスの外にアップロードした画像を保存することです:

D:\somefolder\myWeb\web-app\
D:\somefolder\imagesOutsideContextPath\

そのためのコードは次のとおりです (ローカルで動作):

String path = servletContext.getRealPath("/"); 
String parentFolder = new File(path).getParentFile().getParent();
String imagesFolder = parentFolder + "\\imagesOutsideContextPath";

別のアイデア (これがサーバーで機能しない場合) は、@HoàngLong が提案したように、現在のユーザーのホーム フォルダーに画像を保存することです。

しかし、ビューから画像を読み込むことができません。公式ドキュメントのこの記事は、その目的には有効ではないと思います。次のコードは何もロードしません:

<img src="D:\\somefolder\\imagesOutsideContextPath\\bestImageEver.jpg" alt="if I don't see this message, I'll be happier">

これらの画像をロードするために URL パスの代わりに実際のパスを使用するにはどうすればよいですか?

4

4 に答える 4

2

これを簡単にする新しいプラグインがあります。http: //grails.org/plugin/img-indirectをチェックしてください。

于 2013-08-07T16:58:50.463 に答える
2

アクションを作成する

def profileImage() {
    String profilePicturePath = "${grailsApplication.config.profilePictureDirectoryPath}/${params.id}"
    File file = new File(profilePicturePath)
    response.contentType = URLConnection.guessContentTypeFromName(file.getName())
    response.outputStream << file.bytes
    response.outputStream.flush()
}

次に、このアクションをパラメーターにイメージ名を指定して呼び出します。

<g:img uri="${grailsApplication.config.grails.serverURL}/controller/profileImage/${user?.profilePicture?.fileName}"/>

config.groovy ファイルでイメージ ディレクトリ ファイルを次のように宣言しました。

profilePictureDirectoryPath = '/opt/CvSurgeon/profileImages'
于 2013-08-07T17:42:34.637 に答える
1

を に設定できsrcますaction。これにより、ユーザーは画像が保存されている場所 (セキュリティ) を知ることができず、ロジックを簡単に変更して表示できます。

アクションでは、画像を取得してバイトを出力するだけです。例はこちら

于 2013-08-07T16:01:54.613 に答える
1

まず、参考にしていただきありがとうございます。

実際のパスを使用して画像をロードするのは安全ではありません。Web ブラウザーは、画像がサーバーにどのように保存されているかを認識していないため、フォルダー構造を認識していません。

つまり、システムはすべての写真に特定の URL を使用する必要があるということですhttp://your_app/photo/user/{id}。次に、その URL に対して、id をパラメーターとして取得し、ファイル システムで写真を検索し (もちろん、写真フォルダーを構成に保存する必要があります)、写真をレンダリングするアクションを構築できます。

于 2013-08-08T07:02:04.307 に答える