1

フロントエンドがjavascript/ajaxにあり、バックエンドがREST(jersey)を使用して記述されているシステムがあります。

システムを使用してファイルをダウンロードしたい。私はさまざまなフォーラムを検索し、次のようにRESTWebメソッドを実装しました。

@POST
@Produces({"text/csv"})
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Path("getcsv")
public Response  getcsv(
        @FormParam("usernamecsv") String userid,
        @FormParam("filename") String filename
        )
{
    final File fobj = new File("c:/" +userid + "/output/" + filename);
    try
    {
        final FileInputStream f =  new FileInputStream(fobj);
ContentDisposition cd =  
        ContentDisposition.type("file").fileName(fobj.toString()).build(); 
Response response = Response
.ok()
.lastModified(new Date(fobj.lastModified()))
.type("application/octet-stream")
.header("Content-Disposition", cd)
.entity(f)
.build();
return response;
    }
    catch (FileNotFoundException e1)
    {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    return null;

}

当初、私はStreamingOutputクラスを使用し、その書き込みメソッドを実装していました。そのメソッドでは、ファイルから読み取った文字列を返していました。しかし、私はそれと上記の実装の間に違いは見つかりませんでした。どちらもファイル内の文字列を返します。

私のフロントエンドでは、これは私がやったことです

<!DOCTYPE html >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<script type="text/javascript" src="jquery-1.7.1.min.js"></script>
<title>Insert title here</title>
<script type="text/javascript">
function fun1()
{
$.ajax({
    url: '/RestWSGS/jersey/UserAuthentication/getcsv',
    async: false,
    data: $('#form2').serialize(),
    type: 'POST',
    cache: false,
    contentType: "application/x-www-form-urlencoded",
    processData: false,
    dataType: "text",
    success: function(data)
     {
        var iframe;
        iframe = document.getElementById("hiddenDownloader");
        if (iframe === null)
        {
            var iframe;
            iframe = document.getElementById("hiddenDownloader");
            if (iframe === null)
            {
                iframe = document.createElement('iframe');  
                iframe.id = "hiddenDownloader";
                //iframe.style.visibility = 'hidden';
                $("#mydiv").append(iframe);
            }
            iframe.src = "http:\\localhost:8080\\c:\abc@abc.com#26 8 2012 13 5 49/gr1/output/test.csv";  
//iframe.src = data; 

        }

        alert('Hi');

     }
 });
}
$(function()
        {
            $(document).delegate("#mydiv","click",function(ev)
            {
            fun1();

            });
        });

</script>
</head>
<body>
<div id="mydiv" style='position:absolute;width:20px;height:20px;background:black'></div>
<form id="form2" enctype="multipart/form-data" method="post" >
 <input id ="usernamecsv" name="usernamecsv" type="hidden"  value="abc@abc.com#26 8 2012 13 5 49/gr1"/>
  <input id ="filename" name="filename" type="hidden"  value="test.csv" />
</form>

</body>
</html>

私の問題は、iframe.srcにデータ変数を割り当てると、ファイルが見つからないという応答が返されることです(データ変数にはファイルの内容が含まれていますが)

WebサービスのURI(ajax呼び出しに与えたもの)をiframe.srcに渡すと、パラメーターを送信する方法がわかりません。

私は本当にユーザーにダウンロードプロンプトを表示し、ユーザーがファイルをローカルファイルシステムに保存できるようにする必要があります。POST中にファイルの内容ではなく、firebugにファイルオブジェクトが表示されるはずなので、RESTも正しいとは思いません。

文字列を返して任意のtextarea/divに入力し、ユーザーにコピーしてファイルに貼り付けるように依頼するだけです。しかし、それは滑らかでもエレガントにも見えません!

助けてください、カビタ

編集:@Producesを変更し、Response.type()を「application/csv」および「application/something」に入力しようとしましたが、サーバーから返されたファイルの内容を現在のURLに追加しようとし、ファイルが見つからないので検索してください!!!

編集:RESTでPOSTをGETに変換してみて、返されたデータを使用しました。次に、DOCUMENTを返しますが、それでもファイルを開くことができません

4

2 に答える 2

2

@Producesタグが、インラインで設定したタイプと競合しています。あなたが両方ともそれらapplication/octet-streamを作るならば、私はより良い結果を期待するでしょう。

于 2012-10-19T09:07:00.747 に答える
0

多くのRnDの後、私は自分の問題の解決策を見つけたと思います。これは理想的な解決策ではない可能性があります。大きな問題がある場合はお知らせください。

基本的に、サーバー上のファイルにアクセスしようとしましたが、docrootフォルダー(PATH = C:\ glassfish3 \ glassfish \ domains \ domain1 \ docroot)からしかアクセスできませんでした。そのため、サーバー上の任意の場所からこの場所にファイルをコピーする必要があることに気付きました。私はそれをWebサービスで行いました。どこかで読んで、Webサービスからファイル自体を送信しようとしていました。この変更後、それは間違っていました。私はdocrootに相対的なパスを持つプレーンテキストのみを送り返しました。

次に、ファイルがフォルダー内にある必要があり、フォルダー名に#文字が含まれていたため、別の後退がありました。#は許可されていないようで、iframeはダウンロードを要求しません!!

これで、コードを次のように変更しました:REST:

@POST
@Produces(MediaType.TEXT_PLAIN)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Path("getcsv")
public String  getcsv(
        @FormParam("usernamecsv") String userid,
        @FormParam("filename") String filename
        )
{
    System.out.println("1 = " + getClass().getResource("/" +getClass().getName().substring(
            0, getClass().getName().indexOf("."))).getPath());
    System.out.println("2 = " + getClass().getResource("/" +getClass().getName().substring(
            0, getClass().getName().indexOf("."))).getPath() + "../../../../../docroot/" + userid + "/" + filename);
    final File fobj = new File("c:/" +userid + "/output/" + filename);
    try
    {
        final FileInputStream f =  new FileInputStream(fobj);
    int content;
         ByteArrayOutputStream b = new ByteArrayOutputStream();
        try
        {
            while ((content = f.read()) != -1) 
            {
                //b[j] = 0;
                // convert to byte
                b.write(content);
            }

        } catch (IOException e)
        {
            e.printStackTrace();
        } 
        finally 
        {
            try 
            {
                if (f != null)
                    f.close();
            } catch (IOException ex) 
            {
                ex.printStackTrace();
            }

        }
        File f1 =  new File( getClass().getResource("/"+getClass().getName().substring(
                0, getClass().getName().indexOf("."))).getPath() + "../../../../../docroot/" + userid.substring(0,userid.indexOf("#")) + "/" );
        f1.mkdirs();
        try
        {
        boolean f2 = new File(getClass().getResource("/" +getClass().getName().substring(
                0, getClass().getName().indexOf("."))).getPath() + "../../../../../docroot/" +  userid.substring(0,userid.indexOf("#")) + "/" + filename).createNewFile();
        System.out.println(f2);

        }
        catch (IOException e2)
        {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
    FileOutputStream fout = new FileOutputStream(new File(getClass().getResource("/" +getClass().getName().substring(
            0, getClass().getName().indexOf("."))).getPath() + "../../../../../docroot/" +  userid.substring(0,userid.indexOf("#")) + "/" + filename));
    try
    {
        fout.write(b.toByteArray());
    }
    catch (IOException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
        try
        {
            fout.close();
        }
        catch (IOException e1)
        {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }
    try
    {
        fout.close();
    }
    catch (IOException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }   
}
    catch (FileNotFoundException e1)
    {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    return "/" +  userid.substring(0,userid.indexOf("#")) + "/" + filename;

私のクライアントサイドコード:

<!DOCTYPE html >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<script type="text/javascript" src="jquery-1.7.1.min.js"></script>
<title>Insert title here</title>
<script type="text/javascript">
function fun1()
{
$.ajax({
    url: '/RestWSGS/jersey/UserAuthentication/getcsv',
    async: false,
    data: $('#form2').serialize(),
    type: 'POST',
    cache: false,
    contentType: "application/x-www-form-urlencoded",
    processData: false,
    dataType: "text",
    success: function(data)
     {
        var iframe;
        iframe = document.getElementById("hiddenDownloader");
        if (iframe === null)
        {
            var iframe;
            iframe = document.getElementById("hiddenDownloader");
            if (iframe === null)
            {
                iframe = document.createElement('iframe');  
                iframe.id = "hiddenDownloader";
                //iframe.style.visibility = 'hidden';
                $("#mydiv").append(iframe);
            }


        }
        iframe.src = data;  
        alert('Hi');

     }
 });
}
$(function()
        {
    $(document).delegate("#hiddenDownloader","onload",function(ev)
            {
        alert('in onload');
            });

            $(document).delegate("#mydiv","click",function(ev)
            {
            fun1();

    });
        });
    </script>
</head>
<body>
<a id ='myhref'  href=""></a>
<div id="mydiv" style='position:absolute;width:20px;height:20px;background:black'></div>
<form id="form2" enctype="multipart/form-data" method="post" >
 <input id ="usernamecsv" name="usernamecsv" type="hidden"  value="abc@abc.com#26 8 2012 13 5 49/gr1"/>
  <input id ="filename" name="filename" type="hidden"  value="test.csv" />
</form>

    </body>
</html>

誰かがそれが役に立つと思ってくれることを願っています!! 入力ありがとうございます!

カビタ

于 2012-10-26T06:49:51.777 に答える