1

私は現在、Webアプリケーションに取り組んでいます。このアプリケーションの一部で、特定のディレクトリにファイルをアップロードしたいと思います。最初に、テストケースを作成したとき、これは完全に機能しました。

final static String IMAGE_RESOURCE_PATH = "res/images";

...

File directory = new File(IMAGE_RESOURCE_PATH + "/" + productId);

if(!directory.exists()) {
    directory.mkdirs();
}

これにより、ファイルがアップロードされるディレクトリが作成されます。結果のパスは次のようになります。

[プロジェクトルートフォルダ]/res / images / [productId]

アプリケーションをサーバー(Tomcat 7)にデプロイしてから、ディレクトリは使用しているIDEのルートに作成されます。これは少し混乱します。

例:C:\ Eclipse86 \ res \ images

ハッキングされた手法を使用したり、パスをハードコーディングしたりせずに、プレーンJavaだけでプロジェクトパスに戻す方法はありますか?

4

2 に答える 2

5

絶対パスを指定しない場合、ディレクトリはアプリケーションの作業ディレクトリ内 (または、正しい場合は相対パス) に作成されます。

Web アプリケーション内のディレクトリを取得する場合は、getServletContext().getRealPath(String path). たとえばgetServletContext().getRealPath("/")、アプリケーションのルート ディレクトリへのパスです。

path でディレクトリを作成する[project root folder]/res/images/[productId]には、次のようにします。

// XXX Notice the slash before "res"
final static String IMAGE_RESOURCE_PATH = "/res/images";

...

String directoryPath = 
        getServletContext().getRealPath(IMAGE_RESOURCE_PATH + "/" + productId)
File directory = new File(directoryPath);

if(!directory.exists()) {
    directory.mkdirs();
}
于 2012-10-18T18:54:18.180 に答える
1

Some years ago I wrote a servlet that DOWNloads a file. You could quickly refactor it for uploading. Here you go:

public class ServletDownload extends HttpServlet {

    private static final int BYTES_DOWNLOAD = 1024;  
    public void doGet(HttpServletRequest request, 

    HttpServletResponse response) throws IOException {
        response.setContentType("text/plain");
        response.setHeader("Content-Disposition", "attachment;filename=downloadname.txt");
        ServletContext ctx = getServletContext();
        InputStream is = ctx.getResourceAsStream("/downloadme.txt");

        int read = 0;
        byte[] bytes = new byte[BYTES_DOWNLOAD];
        OutputStream os = response.getOutputStream();

        while((read = is.read(bytes))!= -1) {
            os.write(bytes, 0, read);
        }
        os.flush();
        os.close(); 
    }
}

Also, there is an easy way to get the projects' path, as new File().getAbsolutePath().

于 2012-10-18T20:35:52.360 に答える