我正在尝试从html表单上传文件。我为它编写了一个servlet,它应该在接收到的部分上打开一个输入流,并将数据写入一个具有相同名称和扩展名的文件中。 首先,我遇到了数据本身的问题。例如,具有unicode主体的文本文件不会使用UTF-8正确编码字符。然后我开始使用DataInputStream和DataOutputStream,由于某种原因,现在它正常工作。剩下的是文件名的问题。如果文件名具有unicode字符,则文件名本身将不具有正确的编码,并且将出现一些奇数字符(如预期的那样)。我尝试了几件事,但我不知道如何解决它。我正在使用Wildfly 10.0.10.Final。 因此,例如,如果我的文件名为ááéé.txt,则生成的文件名为ááéé.txt。
这是我的HTML页面:
<html>
<h:head>
<meta charset="UTF-8" />
<meta content="text/html" />
</h:head>
<h:body>
<div class="container">
Upload a new file:
<form enctype="multipart/form-data" method="post" action="upload">
Files: <input multiple="multiple" id="fileUpload" type="file" name="files" />
<input type="submit" multiple="multiple" value="upload" />
</form>
</div>
</h:body>
</html>
我的servlet编写如下:
@WebServlet(name = "fileUploadServlet", urlPatterns = {"/upload"})
@MultipartConfig
public class FileUploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
int n = 0;
for (Part file : req.getParts()) {
String fileName = new String(file.getSubmittedFileName().getBytes("UTF-8"), "UTF-8");
try (DataInputStream dis = new DataInputStream(file.getInputStream());
DataOutputStream dos = new DataOutputStream(new FileOutputStream("E:\\upload\\" + fileName))) {
byte[] buffer = new byte[1024];
int r;
while ((r = dis.read(buffer)) != -1) {
dos.write(buffer, 0, r);
}
n++;
}
}
resp.getWriter().print(n + " files uploaded.");
}
}
提前致谢!
答案 0 :(得分:2)
似乎WildFly实现并没有使用请求的分类编码。 我找到了解决方案:
String filename = new String(part.getSubmittedFileName().getBytes("ISO-8859-1"), "UTF-8");
答案 1 :(得分:0)
req.setCharacterEncoding(...)
有时不起作用。
如果您使用的是Tomcat,请在server.xml的URIEncoding="UTF-8"
部分设置Connector
,例如
<Connector port="80" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" enableLookups="false"
URIEncoding="UTF-8" redirectPort="443" />
我想,Wildfly可能会有类似的设置。