我發送$.post
請求到一個servlet,發送一些數據,這些數據需要保存在一個文件中。該servlet保存數據,然後將路徑發送回該文件。我試圖導航到方法的回調中由response
認爲路徑,但這裏的是怎麼回事:不能使用AJAX響應作爲文件名(不是內容)
function saveData(){
var path;
$.post("SaveFileServlet", {data : JSON.stringify(jsonPieces)}, function(response) {
path = response; // setting the path like this does NOT WORK - nothing happens
//path="storing/csv_uploads/test.csv"; // setting the path like this WORKS
alert (path); // shows: storing/csv_uploads/filename.csv - e.g. WHAT IT SHOULD
$("body").append("<iframe src='" + path + "' style='display: none;' ></iframe>");
});
}
如何使它工作,爲什麼不工作? 謝謝。
甚至較新的編輯
GOT IT !!!!! ......這是Servlet:這可能不是創建該文件:真正的路徑不是filename.csv
但System.currentTimeMillis()+".csv"
,然後我把它寫服務器。但我只是送我創建後的文件中...
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
String filename = "storing/csv_uploads/"+System.currentTimeMillis()+".csv";
//String filename = "storing/csv_uploads/filename.csv"; //this works since it was previously there
PrintWriter out = response.getWriter();
try {
Type type = new TypeToken<List<PieceFeeder>>(){}.getType();
ArrayList<PieceFeeder> pieceFeeders = new Gson().fromJson(request.getParameter("data"), type);
DataManager dm = new DataManager();
if (dm.exportPieces(pieceFeeders, filename)) {
System.out.println("in SaveFileServlet: after exportPieces");
File f = new File(filename);
while (!f.exists()) {
//waiting...I NEVER GET IN HERE
System.out.println("in SaveFileServlet: waiting for file to exist");
}
out.write(filename);
} else {
out.write("error at creating file");
}
}...
}
和DataManager.exportPieces
(或我是誰?):
public void exportPieces(ArrayList<PieceFeeder> pieceFeeders, String filename) {
BufferedWriter bufferedWriter = null;
try {
bufferedWriter = new BufferedWriter(new FileWriter(filename));
//write first line without "\n"
if (pieceFeeders.size() > 0) {
PieceFeeder pf = pieceFeeders.get(0);
Piece p = pf.getPiece();
bufferedWriter.write(p.getDescription() + ","
+ pf.getStock() + ","
+ p.getLength() + ","
+ p.getWidth() + ","
+ p.getLengthEdges() + ","
+ p.getWidthEdges());
}
for (int i = 1; i < pieceFeeders.size(); i++) {
PieceFeeder pf = pieceFeeders.get(i);
Piece p = pf.getPiece();
bufferedWriter.write("\n" + p.getDescription() + ","
+ pf.getStock() + ","
+ p.getLength() + ","
+ p.getWidth() + ","
+ p.getLengthEdges() + ","
+ p.getWidthEdges());
}
return true;
} catch (Exception ex) {
Logger.getLogger(DataManager.class.getName()).log(Level.SEVERE, null, ex);
return false;
} finally {
//Close the BufferedWriter
try {
if (bufferedWriter != null) {
bufferedWriter.flush();
bufferedWriter.close();
System.out.println("in exportPieces: finally");
}
} catch (IOException ex) {
Logger.getLogger(DataManager.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
我總是
"in exportPieces: finally"
"in SaveFileServlet: after exportPieces"
和"in SaveFileServlet: waiting for file to exist"
不會被調用 所以該文件存在發送
響應之前,但如果我發送不是剛剛創建的舊文件*一個),它的工作原理
新編輯
剛要清楚:如果我這樣做:
window.location = path
$("body").append("<iframe src='" + path + "' ></iframe>");
取出display:none
給它一個404 error
:The requested resource() is not available.
但標題顯示我試圖訪問:http://localhost:8080/optimizerwithservlet/storing/csv_uploads/filename.csv
所以它的存在
編輯
爲用戶sugeested我安裝Firebug的,這裏是我得到的:
<iframe style="display: none;" src="storing/csv_uploads/filename.csv">
這意味着它的工作原理!但爲什麼不顯示...?
年長編輯:
的情況下,這可能無所謂,但我對此表示懷疑:這裏是從servlet有關的代碼:
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
String filename = "storing/csv_uploads/filename.csv";
PrintWriter out = response.getWriter();
out.write(filename);
之前,如果你'警報(響應)'你得到預期的結果'PATH = response'? –
是的...你可以看到我先警告(路徑=響應),然後嘗試使用它......並且打印完美... –
如果將iframe的源設置爲完整路徑? –