private static final String DESTINATION_DIR_PATH ="/files";
private File destinationDir;
public void init(ServletConfig config) throws ServletException {
super.init(config);
String realPath = getServletContext().getRealPath(DESTINATION_DIR_PATH);
destinationDir = new File(realPath);
if(!destinationDir.isDirectory()) {
throw new ServletException(DESTINATION_DIR_PATH+" is not a directory");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
response.setContentType("text/html");
out.println();
DiskFileItemFactory fileItemFactory = new DiskFileItemFactory ();
fileItemFactory.setSizeThreshold(1*1024*1024);
//fileItemFactory.setRepository(tmpDir);
ServletFileUpload uploadHandler = new ServletFileUpload(fileItemFactory);
try {
List items = uploadHandler.parseRequest(request);
Iterator itr = items.iterator();
while(itr.hasNext()) {
FileItem item = (FileItem) itr.next();
if(item.isFormField()) {
out.println("File Name = "+item.getFieldName()+", Value = "+item.getString());
} else {
File file = new File(destinationDir,item.getName());
item.write(file);
String fileToBeRead = "C:/ProgramFiles/Apache/Tomcat/webapps/Readcsv/files/"+item.getName();
try {
BufferedReader br = new BufferedReader(new FileReader(fileToBeRead));..... and the code goes on..
我使用上面的代码来读取通过JSP表单上传的.csv文件。 代码工作得非常好。 但我希望代码采用通用格式,因为上面的代码只适用于Windows系统,而不适用于UNIX或任何其他操作系统。
String fileToBeRead = "C:/ProgramFiles/Apache/Tomcat/webapps/Readcsv/files/"+item.getName();
为了完成任务,必须更改此特定行。请告诉我可以做什么,以便代码在其遍历的任何操作系统中都能正常工作。另请指出上述代码中需要更改的所有区域。
答案 0 :(得分:2)
添加上述响应,在Servlet代码中硬编码文件位置并不是一种好习惯,因为它通常会导致Servlet在部署在不同服务器上时无法工作,或者Web应用程序直接从压缩的WAR文件运行。从Web应用程序读取资源的正确方法是使用getResource()或getResourceAsStream()方法。即使Web应用程序部署在多个服务器上或作为压缩WAR,这两种方法也可确保Servlet始终可以访问所需的资源。
getResourceAsStream(java.lang.String path) :getResourceAsStream()方法将InputStream的实例返回到Web应用程序的物理资源。当资源需要逐字读取而不是由Web应用程序处理时,应该使用此方法。
getResource(java.lang.String path) :getResource()方法返回映射到指定路径的资源的URL。当需要读取资源时,应该使用此方法,因为它将显示给客户端。
答案 1 :(得分:1)
您已在file
中拥有该文件。只需替换
new FileReader(fileToBeRead)
通过
new FileReader(file)
或者,甚至更好,完全跳过将文件写入磁盘并立即读取上传文件流的不必要步骤。取代
File file = new File(destinationDir,item.getName());
item.write(file);
try {
BufferedReader br = new BufferedReader(new FileReader(fileToBeRead));
通过
try {
BufferedReader br = new BufferedReader(new InputStreamReader(item.getInputStream()));
您可能希望将charset作为第二个参数提供。我建议使用UTF-8。
答案 2 :(得分:1)
您的代码已包含解决方案:
getServletContext().getRealPath(DESTINATION_DIR_PATH);
这比以下好多了:
String fileToBeRead = "C:/Program Files/Apache/Tomcat/...";
另一句话:不要使用new FileReader()
,因为您无法指定用于将文件字节转换为所需字符的编码。请改用new InputStreamReader(is, encoding)
。