All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.netty.protocol.servlet.ServletFilePart Maven / Gradle / Ivy

package com.github.netty.protocol.servlet;

import com.github.netty.core.util.CaseInsensitiveKeyMap;
import com.github.netty.core.util.ResourceManager;
import com.github.netty.protocol.servlet.util.HttpHeaderConstants;
import io.netty.buffer.ByteBufInputStream;
import io.netty.handler.codec.http.multipart.FileUpload;

import javax.servlet.http.Part;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.function.Supplier;

/**
 * formData File blocks
 *
 * @author wangzihao
 */
public class ServletFilePart implements Part {
    private final FileUpload fileUpload;
    private ResourceManager resourceManager;
    private final Supplier resourceManagerSupplier;
    private Map headerMap;

    public ServletFilePart(FileUpload fileUpload, Supplier resourceManagerSupplier) {
        this.fileUpload = fileUpload;
        this.resourceManagerSupplier = resourceManagerSupplier;
    }

    @Override
    public InputStream getInputStream() throws IOException {
        InputStream inputStream;
        if (fileUpload.isInMemory()) {
            inputStream = new ByteBufInputStream(fileUpload.getByteBuf().retainedDuplicate(), true);
        } else {
            inputStream = new FileInputStream(fileUpload.getFile());
        }
        return inputStream;
    }

    @Override
    public String getContentType() {
        return fileUpload.getContentType();
    }

    @Override
    public String getName() {
        return fileUpload.getName();
    }

    @Override
    public String getSubmittedFileName() {
        return fileUpload.getFilename();
    }

    @Override
    public long getSize() {
        return fileUpload.length();
    }

    @Override
    public void write(String fileName) throws IOException {
        if (resourceManager == null) {
            resourceManager = resourceManagerSupplier.get();
        }
        resourceManager.writeFile(getInputStream(), "/", fileName);
    }

    @Override
    public void delete() throws IOException {
        if (!fileUpload.isInMemory()) {
            fileUpload.delete();
        }
    }

    @Override
    public String getHeader(String name) {
        return getHeaderMap().get(name);
    }

    @Override
    public Collection getHeaders(String name) {
        String value = getHeaderMap().get(name);
        if (value == null) {
            return Collections.emptyList();
        } else {
            return Collections.singletonList(value);
        }
    }

    @Override
    public Collection getHeaderNames() {
        return getHeaderMap().keySet();
    }

    private Map getHeaderMap() {
        if (headerMap == null) {
            Map headerMap = new CaseInsensitiveKeyMap<>(2);
            headerMap.put(HttpHeaderConstants.CONTENT_DISPOSITION.toString(),
                    HttpHeaderConstants.FORM_DATA + "; " + HttpHeaderConstants.NAME + "=\"" + getName() + "\"; " + HttpHeaderConstants.FILENAME + "=\"" + fileUpload.getFilename() + "\"");
            headerMap.put(HttpHeaderConstants.CONTENT_LENGTH.toString(), String.valueOf(fileUpload.length()));
            if (fileUpload.getCharset() != null) {
                headerMap.put(HttpHeaderConstants.CONTENT_TYPE.toString(), HttpHeaderConstants.CHARSET.toString() + '=' + fileUpload.getCharset().name());
            }
            this.headerMap = headerMap;
        }
        return headerMap;
    }

    @Override
    public String toString() {
        return fileUpload.toString();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy