2
private static final String DESTINATION_DIR_PATH ="/files";
private File destinationDir; 
public void init(ServletConfig config) throws ServletException {
        super.init(config);
        String realPath = getServletContext().getRealPath(DESTINATION_DIR_PATH);
        destinationDir = new File(realPath);
        if(!destinationDir.isDirectory()) {
            throw new ServletException(DESTINATION_DIR_PATH+" is not a directory");
        }

    }

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            PrintWriter out = response.getWriter();
            response.setContentType("text/html");
            out.println();
            DiskFileItemFactory  fileItemFactory = new DiskFileItemFactory ();
            fileItemFactory.setSizeThreshold(1*1024*1024);
            //fileItemFactory.setRepository(tmpDir);
            ServletFileUpload uploadHandler = new ServletFileUpload(fileItemFactory);
            try {
                    List items = uploadHandler.parseRequest(request);
                    Iterator itr = items.iterator();
                while(itr.hasNext()) {
                    FileItem item = (FileItem) itr.next();
                    if(item.isFormField()) {
                        out.println("File Name = "+item.getFieldName()+", Value = "+item.getString());
                    } else {
                        File file = new File(destinationDir,item.getName());
                        item.write(file);
                String fileToBeRead = "C:/ProgramFiles/Apache/Tomcat/webapps/Readcsv/files/"+item.getName();
try {
                            BufferedReader br = new BufferedReader(new FileReader(fileToBeRead));..... and the code goes on..

上記のコードを使用して、JSPフォームを介してアップロードされた.csvファイルを読み取ります。コードは完全に正常に機能します。ただし、上記のコードはWindowsシステムでのみ機能し、UNIXやその他のOSでは機能しないため、コードを汎用形式にする必要があります。

String fileToBeRead = "C:/ProgramFiles/Apache/Tomcat/webapps/Readcsv/files/"+item.getName();

この特定の行は、タスクを実行するために変更する必要があります。通過するOSに関係なくコードが正常に機能するように、何ができるかを教えてください。また、上記のコードで変更が必要なすべての領域を指摘してください。

4

3 に答える 3

2

上記の応答に加えて、サーブレットコードでファイルの場所をハードコーディングすると、通常、別のサーバーにデプロイされた場合、またはWebアプリケーションが圧縮されたWARファイルから直接実行された場合にサーブレットが機能しなくなるため、適切な方法ではありません。Webアプリケーションからリソースを読み取るための正しいメソッドは、getResource()メソッドまたはgetResourceAsStream()メソッドのいずれかを使用することです。これらの2つの方法により、Webアプリケーションが複数のサーバーにデプロイされている場合や圧縮されたWARとしてデプロイされている場合でも、サーブレットは常に目的のリソースにアクセスできます。

getResourceAsStream(java.lang.String path):getResourceAsStream()メソッドは、InputStreamのインスタンスをWebアプリケーションの物理リソースに返します。このメソッドは、リソースをWebアプリケーションで処理するのではなく、逐語的に読み取る必要がある場合に使用する必要があります。

getResource(java.lang.String path):getResource()メソッドは、指定されたパスにマップされているリソースへのURLを返します。このメソッドは、クライアントに表示されるリソースを読み取る必要がある場合に使用する必要があります。

于 2010-11-02T21:58:49.010 に答える
1

にファイルがありますfile。交換するだけ

new FileReader(fileToBeRead)

new FileReader(file)

または、さらに良いことに、ファイルをディスクに書き込むという不要な手順を完全にスキップして、アップロードされたファイルストリームをすぐに読み取ります。交換

File file = new File(destinationDir,item.getName());
item.write(file);
try {
    BufferedReader br = new BufferedReader(new FileReader(fileToBeRead));

try {
    BufferedReader br = new BufferedReader(new InputStreamReader(item.getInputStream()));

2番目の引数として文字セットを指定することをお勧めします。これにはUTF-8をお勧めします。

于 2010-11-02T21:33:07.257 に答える
1

あなたのコードにはすでに解決策が含まれています:

getServletContext().getRealPath(DESTINATION_DIR_PATH);

これは、次のよりもはるかに優れています。

String fileToBeRead = "C:/Program Files/Apache/Tomcat/...";

別の注意:new FileReader()ファイルのバイトを必要な文字に変換するために使用されるエンコーディングを指定できないため、を使用しないでください。new InputStreamReader(is, encoding)代わりに使用してください。

于 2010-11-02T21:35:36.853 に答える