Java上传的文件不一样

标签 java file file-upload upload

我的问题如下,我试图通过 servlet 将文件上传到我的服务器,但上传的文件不一样,与原始文件相比有差异。

例如,如果我上传TXT文件为例

# Root logger option
log4j.rootLogger=DEBUG, stdout, file

# Redirect log messages to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p     %c{1}:%L - %m%n

# Rirect log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=C:\\filesLog\\log.log
log4j.appender.file.MaxFileSize=5MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p         %c{1}:%L - %m%n

上传文件有换行

... NULNULNULNULNULNUL

(用Notepad++打开)。

如果文件是 .exe,则上传的文件不起作用。

我的代码如下

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

        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        System.out.println("ES UN REQUEST MULTIPART " + isMultipart);
        // Set factory constraints
        // Create a new file upload handler
        ServletFileUpload upload = new ServletFileUpload();
        // Set overall request size constraint
        // MAX REQUEST SIZE
        // Parse the request
        // List / FileItem / items = upload.parseRequest(request);
        FileItemIterator iter = upload.getItemIterator(request);
        while (iter.hasNext()) {
            // FileItem item = (FileItem) iter.next();
            FileItemStream itemS = (FileItemStream) iter.next();

            if (itemS.isFormField() == false) {
                // Process a file upload
                String fileName = itemS.getName();
                System.out.println("FILE NAME " + fileName);
                // Process a file upload
                File uploadedFile = new File("C:\\FilesUpload\\" + UUID.randomUUID());
                // InputStream uploadedStream = item.getInputStream();

                FileOutputStream fout = new FileOutputStream(uploadedFile);
                BufferedOutputStream bout = new BufferedOutputStream(fout);
                BufferedInputStream bin = new BufferedInputStream(itemS.openStream());
                byte buf[] = new byte[2048];
                Long contador = 0L;
                while ((bin.read(buf)) != -1) {
                    bout.write(buf);
                    contador = contador + 1L;
                }
                bout.close();
                bin.close();
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

最佳答案

在这部分代码中:

 while ((bin.read(buf)) != -1) {
        bout.write(buf);
        contador = contador + 1L;
    }

您没有检查已读取了多少字节。最后读取的缓冲区,如果文件的长度不能完全被 2048 整除,将只读取部分。在这种情况下,bin.read(buf) 将返回读取的字节数,您应该只在写入 buf 时使用该数字,否则您将写入所有buf 中的 2048 字节,包括您之前读取的值或零(如果这是第一次读取)。

所以它应该是这样的:

 int numBytesRead;
 while ((numBytesRead = bin.read(buf)) != -1) {
        bout.write(buf,0,numBytesRead);
        contador = contador + 1L;
 }

这将使它准确地写出它所读到的内容。

顺便说一下,如果您使用的是 Java 7 及更高版本,那么您可以使用 Files.copy 将整个流直接复制到您的文件中,而不是执行所有这些操作。

Files.copy(itemS.openStream(),
           Paths.get("C:\\FilesUpload\\" + UUID.randomUUID()),
           StandardCopyOption.REPLACE_EXISTING );

关于Java上传的文件不一样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32870976/

相关文章:

java - 附加字符串比通过标准 Java stringbuilder.append 获得更好的性能

java - android多次写入文本文件

java - 使用 cmd 脚本调用远程 JVM

java - 从路径中获取文件的大小

c - 在c中使用exe文件

reactjs - React.js,如何将多部分/表单数据发送到服务器

java - 如何让 IzPack 检查软件的现有版本?

java - 在android studio中引用文件

php - 文件上传验证

java - 上传多个大文件时允许注销