我正在关注commons文件上传站点中提供的关于流API的示例.我被困在试图弄清楚如何获取上传文件的文件扩展名,如何将文件写入目录,最糟糕的部分是编写示例评论的人在哪里// Process the input stream...让我想知道它是否是如此微不足道的我是唯一一个不懂得的人.
mad*_*nce 10
在HTML文件中使用此选项:
<form action="UploadController" enctype="multipart/form-data" method="post">
<input type="file">
</form>
Run Code Online (Sandbox Code Playgroud)
在UploadControllerservlet中,doPost方法内部:
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List items = upload.parseRequest(request);
Iterator iterator = items.iterator();
while (iterator.hasNext()) {
FileItem item = (FileItem) iterator.next();
if (!item.isFormField()) {
String fileName = item.getName();
String root = getServletContext().getRealPath("/");
File path = new File(root + "/uploads");
if (!path.exists()) {
boolean status = path.mkdirs();
}
File uploadedFile = new File(path + "/" + fileName);
System.out.println(uploadedFile.getAbsolutePath());
item.write(uploadedFile);
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个 Servlet,它可以完成您想要它做的事情。
package rick;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.util.*;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.annotation.WebServlet;
@WebServlet("/upload4")
public class UploadServlet4 extends HttpServlet{
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.print("Request content length is " + request.getContentLength() + "<br/>");
out.print("Request content type is " + request.getHeader("Content-Type") + "<br/>");
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if(isMultipart){
ServletFileUpload upload = new ServletFileUpload();
try{
FileItemIterator iter = upload.getItemIterator(request);
FileItemStream item = null;
String name = "";
InputStream stream = null;
while (iter.hasNext()){
item = iter.next();
name = item.getFieldName();
stream = item.openStream();
if(item.isFormField()){out.write("Form field " + name + ": "
+ Streams.asString(stream) + "<br/>");}
else {
name = item.getName();
System.out.println("name==" + name);
if(name != null && !"".equals(name)){
String fileName = new File(item.getName()).getName();
out.write("Client file: " + item.getName() + " <br/>with file name "
+ fileName + " was uploaded.<br/>");
File file = new File(getServletContext().getRealPath("/" + fileName));
FileOutputStream fos = new FileOutputStream(file);
long fileSize = Streams.copy(stream, fos, true);
out.write("Size was " + fileSize + " bytes <br/>");
out.write("File Path is " + file.getPath() + "<br/>");
}
}
}
} catch(FileUploadException fue) {out.write("fue!!!!!!!!!");}
}
}
}
Run Code Online (Sandbox Code Playgroud)
所有这些答案的问题在于它没有回答原始问题!
正如它所说的“处理输入流”,它确实让您困惑下一步该做什么。我昨晚一直在看这个问题,试图从其中一个答案中找到线索,但一无所获。我去尝试了其他网站,但一无所获。
问题是,我们所做的超出了文件上传的范围,这就是问题所在。
我们现在正在使用 Java.IO InputStream
InputStream stream = item.openStream();
Run Code Online (Sandbox Code Playgroud)
现在我们使用那个“流”。
在这里您可以找到您所需的各种答案。这是非常愚蠢的,它是如此模糊,并且看起来你必须对 Commons 做一些额外的事情,但实际上它不是 commons InputStream,而是 Java.io 的!
在我们的例子中,我们获取给定的流并通过读取字节数据上传到新文件
该网站还有很多可能有用的选项http://www.jedi.be/blog/2009/04/10/java-servlets-and-large-large-file-uploads-enter-apache-fileupload/
我希望这可以帮助那些对文件上传感到困惑和不熟悉的人,因为我在写这个答案之前几分钟才弄清楚这一点。
这是我的代码,它将文件保存到根驱动器。
try {
System.out.println("sdfk");
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload();
// Parse the request
FileItemIterator iter = upload.getItemIterator(request);
while (iter.hasNext())
{
FileItemStream item = iter.next();
String name = item.getFieldName();
InputStream stream = item.openStream();
System.out.println("File field " + name + " with file name "
+ item.getName() + " detected.");
// Process the input stream
File f = new File("/"+item.getName());
System.out.println(f.getAbsolutePath());
FileOutputStream fout= new FileOutputStream(f);
BufferedOutputStream bout= new BufferedOutputStream (fout);
BufferedInputStream bin= new BufferedInputStream(stream);
int byte_;
while ((byte_=bin.read()) != -1)
{
bout.write(byte_);
}
bout.close();
bin.close();
}
}
catch (FileUploadException ex)
{
Logger.getLogger(UploadServlet.class.getName()).log(Level.SEVERE, null, ex);
}
response.sendRedirect("/plans.jsp");
Run Code Online (Sandbox Code Playgroud)
祝你好运!
| 归档时间: |
|
| 查看次数: |
34654 次 |
| 最近记录: |