【问题标题】:Get file content from multipart format从多部分格式获取文件内容
【发布时间】:2014-05-26 09:31:47
【问题描述】:

我在这里要做的是用户上传他的文件,我会将这个文件存储到我的服务器端

重要提示:我只能使用“servlet-api.jar(2.4 版本)”,不能使用其他 JAR!

我使用<form action=\"/Mapreduce/upload\" method=\"POST\" enctype=\"multipart/form-data\"> 上传我的文件。

然后我使用此代码InputStream whole = request.getInputStream(); 来获取整个输入流。

然后我用这段代码获取文件内容的字符串

BufferedReader br = new BufferedReader(new InputStreamReader(whole, "UTF-8"));
while ((line = br.readLine()) != null) {
      sb.append(line);// sb is stringbuilder here
}

然后,我将从 stringbuilder 获得的字符串转换为 InputStream:

InputStream is = new ByteArrayInputStream(result.getBytes("UTF-8""));

最后,我使用以下代码将此InputStream is 写入另一个文件(temp):

OutputStream outputStream = new FileOutputStream(temp);// temp is a file.
int read = 0;
byte[] bytes = new byte[1024];
while ((read = is.read(bytes)) != -1) {
    outputStream.write(bytes, 0, read);
}

当我上传 .txt 文件时,它可以工作并且我可以打开 temp.txt。但是,当我上传 .docx 文件时,我无法打开 temp.docx。我怎么解决这个问题?是不是我的编码不对?

【问题讨论】:

  • 你用的是servlet上传文件还是Webservice上传文件。为什么即使您使用多部分也需要对文件进行编码。您可以直接上传文件而无需编码
  • @Raju Sharma,它是 servlet 上传文件。实际上,我在这里要做的是用户上传他的文件,我会将这个文件存储到我的服务器端

标签: java file-upload io inputstream multipartform-data


【解决方案1】:

您可以将 Servlet 代码编写为,

Part filepart=request.getPart("file");
    System.out.println(filepart);
    String filename=null;
    if(filepart!=null){
        System.out.println("IF filepart not null");
        System.out.println(filepart.getName());
        System.out.println(filepart.getContentType());
        System.out.println(filepart.getSize());
        System.out.println(filepart.getInputStream());


               String contentDisp = filepart.getHeader("content-disposition");
               System.out.println("content-disposition header= "+contentDisp);
               String[] tokens = contentDisp.split(";");
              for (String token : tokens) {
                if (token.trim().startsWith("filename")) 
                System.out.println(token.substring(token.indexOf("=") + 2, token.length()-1));
            filename=token.substring(token.indexOf("=") + 2, token.length()-1);
            System.out.println("File Name New is: " +filename);            
    }           

    }   

    InputStream inputstream=null;
    if(filepart!=null)
    {
        inputstream=filepart.getInputStream();
        System.out.println("File data: " +inputstream);
    }

在这里您可以获取上传文件的文件名和内容,在此代码之后您可以编写用于将文件存储在数据库或系统中的代码。

【讨论】:

  • @抱歉,我只能使用“servlet-api.jar(2.4 版本)”,不能使用其他 JAR! Part是3.0版本功能!
  • @CSnerd 那么如何在没有 jar 的情况下上传文件。至少您需要 commans-fileupload.jar 和 commans-io.jar 及其各自的版本。
  • 使用下面的人提供的<form action="go" method="post" enctype="multipart/form-data"> Select File:<input type="file" name="fname"/><br/> <input type="submit" value="upload"/>
【解决方案2】:

你不需要做那么多事情。你可以这样做:

index.html

<html>  
<body>  
<form action="go" method="post" enctype="multipart/form-data">  //here go is path for servelet
Select File:<input type="file" name="fname"/><br/>  
<input type="submit" value="upload"/>  
</form>  
</body>  
</html>  

UploadServlet.java

import java.io.*;  
import javax.servlet.ServletException;  
import javax.servlet.http.*;  
import com.oreilly.servlet.MultipartRequest;  

public class UploadServlet extends HttpServlet {  

public void doPost(HttpServletRequest request, HttpServletResponse response)  
    throws ServletException, IOException {  

response.setContentType("text/html");  
PrintWriter out = response.getWriter();  

MultipartRequest m=new MultipartRequest(request,"d:/new");  //d is directory to upload file
out.print("successfully uploaded");  
}  
}

web.xml 文件

<web-app>  

<servlet>  
<servlet-name>UploadServlet</servlet-name>  
<servlet-class>UploadServlet</servlet-class>  
</servlet>  

<servlet-mapping>  
<servlet-name>UploadServlet</servlet-name>  
<url-pattern>/go</url-pattern>  
</servlet-mapping>  

</web-app>  

并从以下链接下载 cos.jar 文件:http://ftp.java2s.com/Code/Jar/c/Downloadcosmultipartjar.htm。并把它放到你的类路径中。

【讨论】:

  • 对不起,我只能使用“servlet-api.jar(2.4版本)”,我不能使用其他JAR!
  • 我认为 servlet-api.jar 文件不支持上传不同的编码文件(如 doc、docx)数据,您只需要使用一些外部 jar 上传文件。同样,如果您使用 java 读取文件,则 java 只能读取 .txt 文件,而不能读取其他文件,例如:doc、docx、pdf。我们需要使用外部 jars 来读取这些文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
  • 2019-05-16
  • 2013-01-13
相关资源
最近更新 更多