`
lucky_god
  • 浏览: 37713 次
社区版块
存档分类
最新评论

java apache common-io上传大文件报错

    博客分类:
  • java
阅读更多

 

我在用apache common-io jar包作影片上传时,发现大文件上传出错,以此博客作为笔记。调试并研究后发现,导致问题的原因是 

byte[] fileData = new byte[(int)this.getSize()]; 

 

当影片size长度大于2G则会强转失败,故作了如下修改:

package org.apache.commons.fileupload.disk;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemHeaders;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ParameterParser;
import org.apache.commons.fileupload.util.Streams;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.output.DeferredFileOutputStream;

import java.io.*;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created by lucky god on 2017/4/24.
 */
public class DiskFileItem implements FileItem {
    private static final long serialVersionUID = 2237570099615271025L;
    public static final String DEFAULT_CHARSET = "ISO-8859-1";
    private static final String UID = UUID.randomUUID().toString().replace('-', '_');
    private static final AtomicInteger COUNTER = new AtomicInteger(0);
    private String fieldName;
    private final String contentType;
    private boolean isFormField;
    private final String fileName;
    private long size = -1L;
    private final int sizeThreshold;
    private final File repository;
    private byte[] cachedContent;
    private transient DeferredFileOutputStream dfos;
    private transient File tempFile;
    private File dfosFile;
    private FileItemHeaders headers;

    public DiskFileItem(String fieldName, String contentType, boolean isFormField, String fileName, int sizeThreshold, File repository) {
        this.fieldName = fieldName;
        this.contentType = contentType;
        this.isFormField = isFormField;
        this.fileName = fileName;
        this.sizeThreshold = sizeThreshold;
        this.repository = repository;
    }

    public InputStream getInputStream() throws IOException {
        if(!this.isInMemory()) {
            return new FileInputStream(this.dfos.getFile());
        } else {
            if(this.cachedContent == null) {
                this.cachedContent = this.dfos.getData();
            }

            return new ByteArrayInputStream(this.cachedContent);
        }
    }

    public String getContentType() {
        return this.contentType;
    }

    public String getCharSet() {
        ParameterParser parser = new ParameterParser();
        parser.setLowerCaseNames(true);
        Map params = parser.parse(this.getContentType(), ';');
        return (String)params.get("charset");
    }

    public String getName() {
        return Streams.checkFileName(this.fileName);
    }

    public boolean isInMemory() {
        return this.cachedContent != null?true:this.dfos.isInMemory();
    }

    public long getSize() {
        return this.size >= 0L?this.size:(this.cachedContent != null?(long)this.cachedContent.length:(this.dfos.isInMemory()?(long)this.dfos.getData().length:this.dfos.getFile().length()));
    }

    public byte[] get() {
        if(this.isInMemory()) {
            if(this.cachedContent == null) {
                this.cachedContent = this.dfos.getData();
            }

            return this.cachedContent;
        } else {
            if (this.getSize() > Integer.MAX_VALUE){
                return null;
            }

            byte[] fileData = new byte[(int)this.getSize()];
            BufferedInputStream fis = null;

            try {
                fis = new BufferedInputStream(new FileInputStream(this.dfos.getFile()));
                fis.read(fileData);
            } catch (IOException var12) {
                fileData = null;
            } finally {
                if(fis != null) {
                    try {
                        fis.close();
                    } catch (IOException var11) {
                        ;
                    }
                }

            }

            return fileData;
        }
    }

    public String getString(String charset) throws UnsupportedEncodingException {
        return new String(this.get(), charset);
    }

    public String getString() {
        byte[] rawdata = this.get();
        String charset = this.getCharSet();
        if(charset == null) {
            charset = "ISO-8859-1";
        }

        try {
            return new String(rawdata, charset);
        } catch (UnsupportedEncodingException var4) {
            return new String(rawdata);
        }
    }

    public void write(File file) throws Exception {
        if(this.isInMemory()) {
            FileOutputStream outputFile = null;
            BufferedInputStream fis = null;
            try {
                outputFile = new FileOutputStream(file);
//                outputFile.write(this.get());

                if (this.getSize() > Integer.MAX_VALUE){
                    byte[] temp = new byte[100*1024*1024];   //100M
                    int len;
                    fis = new BufferedInputStream(new FileInputStream(this.dfos.getFile()));
                    while ((len = fis.read(temp)) != -1){
                        outputFile.write(temp,0, len);
                        outputFile.flush();
                    }
                } else{
                    outputFile.write(this.get());
                }

            } finally {
                if(outputFile != null) {
                    outputFile.close();
                }
                if(fis != null) {
                    fis.close();
                }

            }
        } else {
            File outputFile1 = this.getStoreLocation();
            if(outputFile1 == null) {
                throw new FileUploadException("Cannot write uploaded file to disk!");
            }

            this.size = outputFile1.length();
            if(!outputFile1.renameTo(file)) {
                BufferedInputStream in = null;
                BufferedOutputStream out = null;

                try {
                    in = new BufferedInputStream(new FileInputStream(outputFile1));
                    out = new BufferedOutputStream(new FileOutputStream(file));
                    IOUtils.copy(in, out);
                } finally {
                    if(in != null) {
                        try {
                            in.close();
                        } catch (IOException var19) {
                            ;
                        }
                    }

                    if(out != null) {
                        try {
                            out.close();
                        } catch (IOException var18) {
                            ;
                        }
                    }

                }
            }
        }

    }

    public void delete() {
        this.cachedContent = null;
        File outputFile = this.getStoreLocation();
        if(outputFile != null && outputFile.exists()) {
            outputFile.delete();
        }

    }

    public String getFieldName() {
        return this.fieldName;
    }

    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }

    public boolean isFormField() {
        return this.isFormField;
    }

    public void setFormField(boolean state) {
        this.isFormField = state;
    }

    public OutputStream getOutputStream() throws IOException {
        if(this.dfos == null) {
            File outputFile = this.getTempFile();
            this.dfos = new DeferredFileOutputStream(this.sizeThreshold, outputFile);
        }

        return this.dfos;
    }

    public File getStoreLocation() {
        return this.dfos == null?null:this.dfos.getFile();
    }

    protected void finalize() {
        File outputFile = this.dfos.getFile();
        if(outputFile != null && outputFile.exists()) {
            outputFile.delete();
        }

    }

    protected File getTempFile() {
        if(this.tempFile == null) {
            File tempDir = this.repository;
            if(tempDir == null) {
                tempDir = new File(System.getProperty("java.io.tmpdir"));
            }

            String tempFileName = String.format("upload_%s_%s.tmp", new Object[]{UID, getUniqueId()});
            this.tempFile = new File(tempDir, tempFileName);
        }

        return this.tempFile;
    }

    private static String getUniqueId() {
        int limit = 100000000;
        int current = COUNTER.getAndIncrement();
        String id = Integer.toString(current);
        if(current < 100000000) {
            id = ("00000000" + id).substring(id.length());
        }

        return id;
    }

    public String toString() {
        return String.format("name=%s, StoreLocation=%s, size=%s bytes, isFormField=%s, FieldName=%s", new Object[]{this.getName(), this.getStoreLocation(), Long.valueOf(this.getSize()), Boolean.valueOf(this.isFormField()), this.getFieldName()});
    }

    private void writeObject(ObjectOutputStream out) throws IOException {
        if(this.dfos.isInMemory()) {
            this.cachedContent = this.get();
        } else {
            this.cachedContent = null;
            this.dfosFile = this.dfos.getFile();
        }

        out.defaultWriteObject();
    }

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        in.defaultReadObject();
        if(this.repository != null) {
            if(!this.repository.isDirectory()) {
                throw new IOException(String.format("The repository [%s] is not a directory", new Object[]{this.repository.getAbsolutePath()}));
            }

            if(this.repository.getPath().contains("\u0000")) {
                throw new IOException(String.format("The repository [%s] contains a null character", new Object[]{this.repository.getPath()}));
            }
        }

        OutputStream output = this.getOutputStream();
        if(this.cachedContent != null) {
            output.write(this.cachedContent);
        } else {
            FileInputStream input = new FileInputStream(this.dfosFile);
            IOUtils.copy(input, output);
            this.dfosFile.delete();
            this.dfosFile = null;
        }

        output.close();
        this.cachedContent = null;
    }

    public FileItemHeaders getHeaders() {
        return this.headers;
    }

    public void setHeaders(FileItemHeaders pHeaders) {
        this.headers = pHeaders;
    }
}

 

对应包位置应与原位置一致,博文中包目录不变。

 

附文件下载

 

分享到:
评论

相关推荐

    Apache commons-io-2.5.jar

    5. **效率优化**: Apache Commons IO库的实现通常考虑了性能和效率,尤其是在处理大文件或流时。例如,其内部使用缓冲技术来减少磁盘访问次数,提高操作速度。 6. **兼容性**: "2.5"这个版本意味着该库经过了多次...

    commons-io-2.4 包含了所有commons-io的jar包和源码

    Apache Commons IO 是一个Java库,专注于提供各种I/O操作的实用工具类,这些操作包括文件、流、过滤器、读写、转换、检测等。在本案例中,我们讨论的是"commons-io-2.4"版本,这个版本包含了完整的Apache Commons IO...

    Java IO commons-io-2.5.jar

    总的来说,`commons-io-2.5.jar` 是Java开发者的强大工具,它极大地扩展了Java IO的功能,提高了代码的可读性和维护性。通过这个库,开发者可以更高效地处理文件和目录,减少了重复的代码,提升了工作效率。

    commons-io-2.2

    《Apache Commons IO 2.2:Java I/O操作的强大工具》 Apache Commons IO库是Java开发者广泛使用的工具库,主要用于处理各种I/O操作。在版本2.2中,这个库提供了一系列精心设计和优化的类和方法,极大地简化了与输入...

    java+servlet+commons-io-2.4.jar+commons-fileupload-1.3.jar实现文件的上传与下载

    Apache Commons IO是一个Java库,提供了大量的实用工具类,用于处理基本的IO操作,如读写文件、复制流、处理路径等。而Apache Commons FileUpload则专门用于处理HTTP请求中的多部分数据,即文件上传。 二、Servlet...

    common-io,common-net打包奉送

    Apache Commons IO库(common-io)是一个专注于I/O操作的实用工具集,提供了大量的静态方法来处理文件、流、过滤器、读写操作等。其中包含的功能有: 1. 文件操作:如创建、复制、移动、删除文件,以及检查文件属性...

    Java-apache-maven-3.3.1.rar-安装包-kaic

    Java_apache-maven-3.3.1.rar_安装包_kaic Java_apache-maven-3.3.1.rar_安装包_kaic Java_apache-maven-3.3.1.rar_安装包_kaic Java_apache-maven-3.3.1.rar_安装包_kaic Java_apache-maven-3.3.1.rar_安装包_kaic ...

    common-io.jarcommon-io.jar

    总的来说,Apache Commons IO库极大地提高了Java开发中处理I/O任务的效率和便利性。无论是文件操作,还是流的处理,都有现成的工具类可用,避免了重复造轮子,同时也降低了出错的可能性。这个库已经被广泛应用于各种...

    commons-io-2.6.jar下载

    Commons IO 是 Apache Software Foundation 开发的一个 Java 库,它的核心组件是 `commons-io-2.6.jar`。这个版本的 JAR 文件包含了丰富的输入/输出流、文件操作、I/O 流工具类以及与文件系统交互的相关功能。下面将...

    common-io,common-fileupload.jar等jar包

    在Java开发中,`common...总之,`common-io`和`common-fileupload`是Java开发中的强大工具,它们简化了常见的I/O操作和文件上传处理,提高了开发效率。了解并熟练运用这些库,能帮助开发者更好地应对实际项目中的挑战。

    common-io监听文件夹并发送rabbitmq

    标题中的“common-io监听文件夹并发送rabbitmq”是指使用Java的Apache Commons IO库来监控一个文件夹的变化,一旦文件夹内有文件新增、修改或删除等事件发生,就会触发相应的处理逻辑,将这些变化通过RabbitMQ消息...

    commons-io-2.11.0.rar

    Apache Commons IO 是一个Java库,专门用于处理输入/输出(I/O)操作。这个库提供了大量的实用工具类,简化了常见的文件、流、过滤器、读写操作等任务。"commons-io-2.11.0.rar"是Apache Commons IO库的版本2.11.0的...

    commons-fileupload-1.2.2 common-io-2.0.1

    在开发过程中,Apache Commons IO可以极大地简化处理文件和流的工作,提高代码的可读性和可靠性。 除了这两个组件,我们还看到`commons-beanutils-1.8.3-bin.zip`,这是Apache Commons BeanUtils的1.8.3版本。这个...

    上传架包commmon-fileupload common-io

    标题中的"上传架包commmon-fileupload common-io"指的是两个常用的Java库,它们分别是Apache Commons FileUpload和Apache Commons IO。这两个库在Java开发中扮演着重要角色,特别是处理文件上传和I/O操作。 Apache ...

    commons-fileupload-1.3.3.jar和commons-io-2.6.jar

    在Java开发中,上传文件是一项常见的任务,而`commons-fileupload-1.3.3.jar`和`commons-io-2.6.jar`是Apache Commons项目中的两个重要库,专门用于处理HTTP请求中的文件上传功能。这两个库为开发者提供了便捷、高效...

    common-fileupload&amp;common-io

    "common-fileupload"和"common-io"是Apache Commons项目中的两个重要组件,它们为处理文件上传和输入/输出提供了强大的支持。接下来,我们将详细讨论这两个库的功能、使用方法及其在JSP应用中的重要性。 Apache ...

    commons-io-2.4.jar包 官方免费版

    Commons IO是Java编程语言中的一个开源库,由Apache软件基金会维护。这个库提供了一系列与输入输出操作相关的实用工具类,极大地简化了Java程序员处理IO任务的复杂性。标题提到的"commons-io-2.4.jar"是这个库的一个...

    Java-apache-tomcat-9.0.0.M27x64安装包-kaic.rar

    Java_apache-tomcat-9.0.0.M27x64安装包_kaic.rar Java_apache-tomcat-9.0.0.M27x64安装包_kaic.rar Java_apache-tomcat-9.0.0.M27x64安装包_kaic.rar Java_apache-tomcat-9.0.0.M27x64安装包_kaic.rar Java_apache-...

    fileupload commons-io上传文件

    以上就是关于“fileupload commons-io上传文件”这一主题的详细说明,涵盖了Apache Commons IO和FileUpload库在文件上传中的应用,以及如何使用这两个库实现文件上传功能的基本步骤。在实际开发中,根据具体需求,还...

Global site tag (gtag.js) - Google Analytics