从多部分格式获取文件内容

问题描述 投票:0回答:2

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

重要提示:我只能使用“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
写入另一个文件(临时):

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。我怎么解决这个问题?是不是我的编码错误?

java file-upload io inputstream multipartform-data
2个回答
0
投票

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

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。并将其放入您的类路径中。


-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);
    }

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

© www.soinside.com 2019 - 2024. All rights reserved.