5

jersey マルチパート実装を使用して、次の REST サービス (このチュートリアルから) を使用して、さまざまな数のクライアントから GlassFish サーバーにファイルをアップロードします。

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import com.sun.jersey.core.header.FormDataContentDisposition;
import com.sun.jersey.multipart.FormDataParam;

@Path("/fileupload")
public class UploadFileService {

    @POST
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response uploadFile(
        @FormDataParam("file") InputStream uploadedInputStream,
        @FormDataParam("file") FormDataContentDisposition fileDetail) {

        String uploadedFileLocation = "c://uploadedFiles/" + fileDetail.getFileName();

        // save it
        saveToFile(uploadedInputStream, uploadedFileLocation);

        String output = "File uploaded via Jersey based RESTFul Webservice to: " + uploadedFileLocation;

        return Response.status(200).entity(output).build();
    }

    // save uploaded file to new location
    private void saveToFile(InputStream uploadedInputStream,
        String uploadedFileLocation) {

        try {
            OutputStream out = null;
            int read = 0;
            byte[] bytes = new byte[1024];

            out = new FileOutputStream(new File(uploadedFileLocation));
            while ((read = uploadedInputStream.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }
            out.flush();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

このコードは私にとっては問題なく機能しますが、次のことに気付きました。

  1. 最初にファイルがサーバーのどこかにアップロードされます
  2. メソッド uploadFile(...) は、アップロードされたファイルへの InputStream でトリガーされるため、saveToFile(...) を使用して目的の場所にコピーを作成できます。

私の質問は次のとおりです。

  • ファイル (上記 (1) を参照) は最初にどこに保存されていますか?
  • アップロードされたファイルを削除してリソースを解放するには?

更新 1

InputStream ダンプを添付: ここに画像の説明を入力

ここで奇妙なことに、スクリーンショットの .tmp ファイルのサイズは 0 バイトです。.tmp は out.close() の後に削除されます

4

1 に答える 1

4

アップロードされたファイルは、おそらくメモリに保持されるか (入力ストリームが gc によってクリーンアップされると解放されることを意味します)、またはシステムのデフォルトの一時フォルダーに保存されます。(おそらく、 によって返される同じフォルダーSystem.getProperty("java.io.tmpdir")です。つまり、ファイル システムから一時ファイルを消去するたびに消去されます。

正確な場所は、残りのサービスを処理するフレームワークによって異なります。あなたの場合、それはジャージのようです。

jersey がこれらのファイルを保存する場所がわかりません。提供された入力ストリームを見て、それがどのタイプで、どこに保存されているかを確認してみてください。

于 2013-07-12T09:10:38.920 に答える