2012-09-14 18 views
0

我有以下情况: 我必须动态地创建文件,用户代理通过AJAX将数据发送到服务器以这样的方式最近创建的文件不能下载

$("#generateButton").live("click",function(){ 
dateLimite = $("#dateLimite").val(); 
$.ajax({ 
    type : "POST", 
    url  : "../generateFile.do", 
    data : { fileName: "demandeExplication", 
    nbrParam: "3", 
    param1:"<%=agent.getPrenomAgentArabe()+" "+agent.getNomAgentArabe()%>", 
    param2:"<%=descriptionActe%>", 
    param3:dateLimite, 
    }, 
    dataType: "html", 

}).done(function(data) { 
$("#test").empty().append(data); 
    fileName = $("#test").find("input").val(); 
$.fileDownload('http://localhost:8080/gestionRH/fiches/temp/'+fileName); 

}); 
}); 

服务器进程本与创建一个文件dynamicaly动作数据:

public class GenerateFile extends Action 
{ 



public ActionForward execute(ActionMapping mapping, ActionForm form, 
     HttpServletRequest request, HttpServletResponse response) throws IOException { 
    String fileName = request.getParameter("fileName"); 
    Integer nbrParam = Integer.parseInt(request.getParameter("nbrParam")); 
    String[] valueParam = new String[nbrParam+1]; 
    for(int i =1;i<=nbrParam;i++) 
    { System.out.println(request.getParameter("param"+i)); 
     valueParam[i]=request.getParameter("param"+i); 
    } 
    FileInputStream in = new FileInputStream("C:\\Users\\free\\Desktop\\myworkspace\\gestionRH\\WebRoot\\fiches\\"+fileName+".doc"); 
    POIFSFileSystem fs = new POIFSFileSystem(in); 
    HWPFDocument doc = new HWPFDocument(fs); 
    Range r = doc.getRange(); 
    for(int i=1;i<=nbrParam;i++) 
    { System.out.println("<param"+i+">"); 
     System.out.println(valueParam[i]); 
     r.replaceText("<param"+i+">", valueParam[i]); 
    } 


    File frr = new File("C:\\Users\\free\\Desktop\\myworkspace\\gestionRH\\WebRoot\\fiches\\temp"); 
    File temp = File.createTempFile("monfile",".doc",frr); 
    FileOutputStream out = new FileOutputStream(temp); 
    doc.write(out); 
    out.close(); 
    in.close(); 
    request.setAttribute("fileName", temp.getName()); 
    return mapping.findForward("fileName"); 
} 
} 

我使用这个插件做下载:http://johnculviner.com/category/jQuery-File-Download.aspx

,我收到了n错误下载! 我不与已存在的文件获得,或当我引发一些时间与此代码后下载:

function timeout_trigger() {  

文件名= $(“#测试”)找到(“输入”)VAL。 (); }

至极我使用这种方式:

......}).done(function(data) { 
setTimeout("timeout_trigger()",7000); 
}); 

和第二个解决方案并不总是工作,所以我必须解决这个问题。 为什么已经下载的文件没有问题,并且最近在下载时创建了显示错误?

+0

似乎是一个计时问题,其中http请求创建文件已完成,但服务器还没有实际完成生成文件。在你的服务器端代码中,你是结束请求并在另一个线程上处理文件,还是应该在请求结束之前完成? –

+0

通常它应该在请求结束前完成,因为它会将文件的名称返回给客户端以便下载它 – fatiDev

回答

2

这可能是因为该文件尚未上传。使用AJAX,文件将在后台上传。这需要时间。服务器代码只有在整个文件被上传后才被触发(它不希望在部分文件上运行)。

所以你需要的是一种方法来问:“有没有上传这个进程?”。当我遇到同样的问题时,我发送了几个AJAX请求。第一个会在会话中创建一个状态对象,我将记录文件名。

当查询文件时,我会查看该状态对象以查看上传是否完成并返回状态。

还有方法挂钩上传过程;当你这样做时,你甚至可以添加一个“上传百分比”到状态对象。