我正在编写一个逻辑,当用户第一次访问网页时(例如,在他的个人资料页面中)用户上传文本文件。下次用户访问网页时,他应该能够将上传的文件作为链接找到。
到目前为止,我已经能够在用户特定路径中上传文件,并详细说明如何在网页中显示该文件。
我关注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>
如果我不清楚,请告诉我。
答案 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>