如何上传文件(txt,pdf)并在同一网页上显示?

时间:2016-02-08 14:05:32

标签: java html jsp file-upload struts2

我正在编写一个逻辑,当用户第一次访问网页时(例如,在他的个人资料页面中)用户上传文本文件。下次用户访问网页时,他应该能够将上传的文件作为链接找到。

到目前为止,我已经能够在用户特定路径中上传文件,并详细说明如何在网页中显示该文件。

我关注mkyong但我在这里找到的问题是动作结果是在流中,而在我的情况下,valuestack有其他动作细节。

代码片段:

1. 行动类

public String uploadResume(){

    try{

        if(uploadFile==null){
            throw new NullPointerException();
        }

    File file = new File("/Users/shibasish/Documents/","/" 
                    + GenerateTimestampID.generateTimestamp()+"/shibasish");
    if (!file.exists()) {
        if (file.mkdirs()) {
            System.out.println("Directory is created!");
        } else {
            System.out.println("Failed to create directory!");
        }
    }
    String filePath = file.getPath();
    File fileToCreate = new File(filePath, uploadFileFileName);
    FileUtils.copyFile(uploadFile, fileToCreate);       

    }catch(NullPointerException e){
        addActionError("Please upload a resume");
    }
    catch(Exception e){
        e.printStackTrace();
    }
    return "success";
}

2的 struts.xml中

<action name="uploadResume" class="com.msventure.web.actions.CompleteProfileAction" 
              method="uploadResume"> 
    <interceptor-ref name="defaultStack">
    <param name="fileUpload.allowedTypes">
        text/plain,application/pdf,application/octet-stream
    </param>
</interceptor-ref> 
        <result name="success">/profile.jsp</result>
        <result name="fail">/login.jsp</result>
        <result name="index">/index.jsp</result>
          <result name="login">/talent.jsp</result>
    </action>

JSP

<form id="login" name="login" method="post" action="signup">
<p>
    <input type="submit" value="Update" />
</p>
  </form> 

  <s:if test="uploadFile neq null">
  <!--<h4>Download file - <s:a href="uploadFile">fileABC.txt</s:a></h4>-->
  <a href="<s:property value="uploadFile" />" />
  </s:if>
  <s:form id="login" name="login" method="post" action="uploadResume" 
       enctype="multipart/form-data">
    <s:file name="uploadFile" label="Select a File to upload" size="40"/>
    <s:submit value="submit" name="submit"/>
    <!--<input type="button" value="Search" id="resumeupload" />-->
</s:form>

如果我不清楚,请告诉我。

2 个答案:

答案 0 :(得分:1)

您无法返回JSP页面二进制文件。

返回JSP时,使用dispatcher结果,在返回文件时,使用stream结果。

在您上传文件后,您有两种选择:

  

1。仅显示文件

     

在包含target="_blank"的新标签页中发布表单,然后返回stream个结果;用户最终会有两个选项卡,一个带有配置文件,另一个带有文档。

  

2。显示嵌入了文件的JSP

     

在个人资料页面中使用<iframe>,并使用target="name_of_the_frame_here"发布定位iframe的表单。

有更复杂的方法(返回一个JSP,并将服务器组成一个id,你将在iframe调用的辅助操作上使用它来获取文档),但我只是选择解决方案<强>#2

答案 1 :(得分:1)

虽然Andrea提供了最好的方法,但我上传了我使用iframe的代码并在relogin上下载了用户特定的文件。 我希望这会有所帮助。

1.JSP:这是iframe中的JSP

<s:form id="login" name="login" method="post" action="uploadResume" 
                                             enctype="multipart/form-data">
    <s:file name="uploadFile" label="Select a File to upload" size="40"/>
    <s:submit value="submit" name="submit"/>
</s:form><a href="downloadResume">Download file</a>

2.Action方法:上传简历后,保留用户特定路径。我已使用Cookie进行用户识别。

public String downloadResume() {

    try {

        Cookie[] currentCookie;
        String usrCookie = "sample";
        String cookieFlg;
        currentCookie = request.getCookies();

        for (int i = 0; i < currentCookie.length; i++) {
            if (currentCookie[i].getName().equals("_usr")) {
                usrCookie = currentCookie[i].getValue();
            }
        }

        if (!usrCookie.equalsIgnoreCase("sample")) {

            userProfileObj = new UserProfile();

            String pathloc=userProfileObj.getResumePath(usrCookie);

            if(pathloc==null){
                //throw new NullPointerException();
                addActionError("Please upload a resume");
                return "fail";
            }
            else{
            File folder = new File(pathloc);
            File[] listFile=folder.listFiles();
            File fileToDownload=new File(pathloc+"/"+listFile[1].getName());
            for(int i=0;i<listFile.length;i++){
                System.out.println("list of files : "+listFile[i].getName());
            }
            //System.out.print("Files in the directory : "+fileToDownload);

            inputStream = new FileInputStream(fileToDownload);
            fileName = fileToDownload.getName();
            Long contentLength = fileToDownload.length();
            }
        }

    } catch (NullPointerException e) {
        e.printStackTrace();
        addActionError("Please upload a resume");
        return "success";
    } catch (Exception e) {
        e.printStackTrace();
    }
    return "success";
}

<强> 3.struts.xml

<action name="downloadResume" class="com.msventure.web.actions.CompleteProfileAction" 
                             method="downloadResume">
        <result name="success" type="stream">
            <param name="contentType">application/octet-stream</param>
            <param name="inputName">inputStream</param>
            <param name="contentDisposition">attachment;filename="${fileName}"</param>
            <param name="bufferSize">1024</param>
        </result>
        <result name="fail">/filemanagement.jsp</result>
    </action>