package com.litesuits.http.request.content.multi; import com.litesuits.http.data.Consts; import com.litesuits.http.utils.StringCodingUtils; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.nio.charset.Charset; /** * 抽象上传类 * * @author MaTianyu * @date 14-7-29 */ public abstract class AbstractPart { protected static final Charset infoCharset = BoundaryCreater.charset; public static final byte[] CR_LF = StringCodingUtils.getBytes("\r\n", infoCharset); public static final byte[] TRANSFER_ENCODING_BINARY = StringCodingUtils.getBytes("Content-Transfer-Encoding: binary\r\n", infoCharset); public static final byte[] TRANSFER_ENCODING_8BIT = StringCodingUtils.getBytes("Content-Transfer-Encoding: 8bit\r\n", infoCharset); protected String key; public byte[] header; protected String mimeType = Consts.MIME_TYPE_OCTET_STREAM; protected MultipartBody multipartBody; protected AbstractPart(String key, String mimeType) { this.key = key; if (mimeType != null) { this.mimeType = mimeType; } } //此方法需要被调用以产生header(开发者无需自己调用,Entity会调用它) public byte[] createHeader(byte[] boundaryLine) { ByteArrayOutputStream headerStream = new ByteArrayOutputStream(); try { headerStream.write(boundaryLine); headerStream.write(createContentDisposition()); headerStream.write(createContentType()); headerStream.write(getTransferEncoding()); headerStream.write(CR_LF); header = headerStream.toByteArray(); } catch (IOException e) { e.printStackTrace(); } return header; } protected abstract byte[] createContentType(); protected abstract byte[] createContentDisposition(); public abstract long getTotalLength() throws IOException; public abstract byte[] getTransferEncoding(); public abstract void writeTo(OutputStream out) throws IOException; public void writeToServer(OutputStream out) throws IOException { if (header == null) { throw new RuntimeException("Not call createHeader(),未调用createHeader方法"); } out.write(header); updateProgress(header.length); writeTo(out); } public MultipartBody getMultipartBody() { return multipartBody; } public void setMultipartBody(MultipartBody multipartBody) { this.multipartBody = multipartBody; } protected void updateProgress(int length) { if (multipartBody != null) { multipartBody.updateProgress(length); } } }