フロントエンドが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を返しますが、それでもファイルを開くことができません