我发送$.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的源设置为完整路径? –