1

私のダウンロードシナリオは次のとおりです。jspのダウンロードリンクをクリックすると、ファイルのIDで署名されたアプレットメソッドが呼び出され、アプレットからそのIDを渡してサーバー側のメソッドが呼び出されます。サーバー側でそのファイルを取得できますが、そのファイルをアプレット関数に返す/渡したいです。私の質問は、ダウンロードしたファイルをアプレットに戻すか渡す方法ですか? または、アプレットで役立つサーバー側の応答オブジェクトにファイルを設定するにはどうすればよいですか?

私の署名付きアプレット:

private static void downloadEncryptedFile(String uuid) throws HttpException, IOException {
  String uri = "http://localhost:8080/encryptFileDownload.works?uuid="+uuid;
  HttpClient client = new HttpClient();
  PostMethod postMethod = new PostMethod(uri);
  postMethod.setRequestHeader("Content-type", "text/xml; charset=ISO-8859-1");
  client.executeMethod(postMethod);
  postMethod.releaseConnection();   
}

私のサーバー側の機能:

@RequestMapping(value = "/encryptFileDownload/{uuid}.works", method = RequestMethod.POST)
public String downloadEncryptFile(@PathVariable("uuid") String uuid, HttpSession session, HttpServletResponse response) {
  try {
    if (StringUtils.isNotEmpty(uuid)) {
      LOG.info("-----UUID----");
      Node node = contentRetrieveService.getByNodeId(uuid);
      Node resource = node.getNode("jcr:content");
      response.setContentType("application/octet-stream");
      response.setHeader("Content-Disposition", "attachment; filename=\"" + node.getName() + "\"");
      InputStream in = resource.getProperty("jcr:data").getBinary().getStream();
      ServletOutputStream outs = response.getOutputStream();
      int i = 0;
      while ((i = in.read()) != -1) {
        outs.write(i);
      }
      outs.flush();
      outs.close();
      in.close();
      LOG.info("File Downloaded");
    }
  } catch (Exception e) {
    e.printStackTrace();
  }
  return null;
}
4

1 に答える 1

1

私は解決策を得ました。ファイルIDを渡してダウンロードし、そのファイルをアプレットに戻したかったので、コードを次のように変更しました。

私のアプレット:

try {       
            URL urlServlet = new URL("uri for your servlet");
            URLConnection con = urlServlet.openConnection();
            con.setDoInput(true);
            con.setDoOutput(true);
            con.setUseCaches(false);
            con.setRequestProperty(
                "Content-Type",
                "application/x-java-serialized-object");

            // send data to the servlet
            OutputStream outstream = con.getOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(outstream);
            oos.writeObject(uuid);
            oos.flush();
            oos.close();

            // receive result from servlet
            InputStream instr = con.getInputStream();
            ObjectInputStream inputFromServlet = new ObjectInputStream(instr);
            String name = con.getHeaderField("filename");
            File fi = new File(name);
            int i = 0;
            while ((i = inputFromServlet.read()) != -1) {
                System.out.println(inputFromServlet.readLine());
            }
            inputFromServlet.close();
            instr.close();

        } catch (Exception ex) {
            ex.printStackTrace();
        }

サーバー側の関数は次のように置き換えます。

OutputStream outs = response.getOutputStream();
                outputToApplet = new ObjectOutputStream(outs);
                int i = 0;
                while ((i = in.read()) != -1) {
                    outputToApplet.write(i);
                }
于 2012-08-14T06:25:38.713 に答える