我正在开发一个简单的文件上传器。简单的文件上传器添加应该分别将各种文件(图像/,视频/,音频/,文本/和应用程序/***(上传到图像,视频,音频,文本和应用程序目录。我在将路径(例如视频/(附加到@MultipathConfig(位置="/files/uploads"(注释中指定的当前目录时遇到问题。我希望上传视频的路径为/files/uploads/video/aws_signs_javas_creator.mp4我正在开发Netbeans 8.02,Ubuntu上的GlassFish Server 4.0。
索引.jsp
<form method="POST" action="upload" enctype="multipart/form-data">
<div>
<input type="file" id="file" name="file" multiple/>
</div>
<div>
<button type="submit" name="upload">Upload</button>
</div>
</form>
文件上传器.java
@WebServlet(name = "FileUploader", urlPatterns = {"/upload"})
@MultipartConfig(location = "/files/upload")
public class FileUploadController extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<Part> fileParts = request.getParts().stream().filter(part -> "file".equals(part.getName())).collect(Collectors.toList());
InputStream fileContent = null;
String fileName = null;
String fileType = null;
for (Part filePart : fileParts) {
if (filePart.getSize() != 0) {
fileName = Decorator.getFileName(filePart);
fileType = filePart.getContentType();
fileContent = filePart.getInputStream();
filePart.write(location + fileName);
if(fileType.contains("image/")) {
filePart.write("/images/" + fileName);
} else if(fileType.contains("application/")) {
filePart.write("/applications/" + fileName);
} else if(fileType.contains("video/")) {
filePart.write("/videos/" + fileName);
} else if(fileType.contains("text/")) {
filePart.write("/texts/" + fileName);
} else if(fileType.contains("audio/")) {
filePart.write("/audios/" + fileName);
}
}
}
}
private String getFileName(final Part part) {
final String partHeader = part.getHeader("content-disposition");
LOGGER.log(Level.INFO, "Part Header = {0}", partHeader);
for (String content : part.getHeader("content-disposition").split(";")){
if (content.trim().startsWith("filename")) {
return content.substring(
content.indexOf('=') + 1).trim().replace(""", "");
}
}
return null;
}
}
错误的两个可能原因:
传入以 /
开头的文件名。也许 Glassfish 不会相对于上传目录而是相对于绝对位置写入它。因此请尝试
filePart.write("images/" + fileName);
等。
如果子目录尚不存在,则部件的写入也可能失败。(这发生在雄猫中(。
在这两种情况下,服务器日志文件都希望包含有关出现问题的提示。