    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.hayabusa.servlet.multipart;
    017
    018import java.io.BufferedOutputStream;
    019import java.io.File;
    020import java.io.FileOutputStream;
    021import java.io.IOException;
    022import java.io.InputStream;
    023import java.io.OutputStream;
    024
    025import javax.servlet.ServletInputStream;
    026import javax.servlet.http.HttpSession;
    027
    028import org.opengion.fukurou.util.Closer ;
    029import org.opengion.hayabusa.common.HybsSystem;
    030import org.opengion.hayabusa.io.StorageAPI;
    031import org.opengion.hayabusa.io.StorageAPIFactory;
    032
    033/**
    034 * ファイルアップロード時のマルチパート処理のファイルパート部品です。
    035 *
    036 * ファイル情報を取り扱います。
    037 *
    038 * @og.group その他機能
    039 *
    040 * @version  4.0
    041 * @author   Kazuhiko Hasegawa
    042 * @since    JDK5.0,
    043 */
    044public class FilePart extends Part {
    045
    046        private String filename;
    047        private final String filePath;
    048        private final String contentType;
    049        private final PartInputStream partInput;
    050
    051        /**
    052         * ファイルパート部品 オブジェクトを構築する、コンストラクター
    053         *
    054         * @param       name            Part名称
    055         * @param       in                      ServletInputStreamオブジェクト
    056         * @param       boundary        境界文字
    057         * @param       contentType     コンテンツタイプ
    058         * @param       filename        ファイル名
    059         * @param       filePath        ファイルパス
    060         * @throws IOException 入出力エラーが発生したとき
    061         */
    062        FilePart( final String name, final ServletInputStream in, final String boundary,
    063                        final String contentType, final String filename, final String filePath)
    064                                                                                        throws IOException {
    065                super(name);
    066                this.filename = filename;
    067                this.filePath = filePath;
    068                this.contentType = contentType;
    069                partInput = new PartInputStream(in, boundary);
    070        }
    071
    072        /**
    073         * ファイル名を取得します。
    074         *
    075         * @return      ファイル名
    076         */
    077        public String getFilename() {
    078                return filename;
    079        }
    080
    081        /**
    082         * ファイル名をセットします。
    083         *
    084         * @param  fname ファイル名
    085         */
    086        public void setFilename( final String fname ) {
    087                filename = fname ;
    088        }
    089
    090        /**
    091         * ファイルパスを取得します。
    092         *
    093         * @return      ファイルパス
    094         */
    095        public String getFilePath() {
    096                return filePath;
    097        }
    098
    099        /**
    100         * コンテンツタイプを取得します。
    101         *
    102         * @return      コンテンツタイプ
    103         */
    104        public String getContentType() {
    105                return contentType;
    106        }
    107
    108        /**
    109         * 入力ストリームを取得します。
    110         *
    111         * @return      入力ストリーム
    112         */
    113        public InputStream getInputStream() {
    114                return partInput;
    115        }
    116
    117        /**
    118         * 指定のファイルに書き出します。
    119         *
    120         * @param       fileOrDirectory 出力先ファイル名/ディレクトリ名
    121         *
    122         * @return      ストリームに書き出したバイト数
    123         * @throws  IOException 入出力エラーが発生したとき
    124         */
    125        public long writeTo( final File fileOrDirectory ) throws IOException {
    126                long written = 0;
    127
    128                OutputStream fileOut = null;
    129                try {
    130                        // Only do something if this part contains a file
    131                        if(filename != null) {
    132                                // Check if user supplied directory
    133                                File file;
    134                                if(fileOrDirectory.isDirectory()) {
    135                                        // Write it to that dir the user supplied,
    136                                        // with the filename it arrived with
    137                                        file = new File(fileOrDirectory, filename);
    138                                }
    139                                else {
    140                                        // Write it to the file the user supplied,
    141                                        // ignoring the filename it arrived with
    142                                        file = fileOrDirectory;
    143                                }
    144                                fileOut = new BufferedOutputStream(new FileOutputStream(file));
    145                                written = write(fileOut);
    146                        }
    147                }
    148                finally {
    149                        Closer.ioClose( fileOut );              // 4.0.0 (2006/01/31) close 処理時の IOException を無視
    150                }
    151                return written;
    152        }
    153
    154        /**
    155         * ｸﾗｳﾄﾞｽﾄﾚｰｼﾞへのｱｯﾌﾟﾛｰﾄﾞ
    156         *
    157         *
    158         * @og.rev 5.9.25.0 (2017/10/06) 追加
    159         * @param storage               クラウド種別
    160         * @param directory             ｱｯﾌﾟﾛｰﾄﾞ先ﾃﾞｨﾚｸﾄﾘ
    161         * @param hsession              ｾｯｼｮﾝ
    162         */
    163        public void writeToCloud(String storage, String directory, HttpSession hsession){
    164                StorageAPI storageApi = StorageAPIFactory.newStorageAPI(storage, HybsSystem.sys("CLOUD_STORAGE_CONTAINER"), hsession);
    165                storageApi.add(partInput, directory, filename, hsession);
    166        }
    167
    168        /**
    169         * 指定のストリームに書き出します。
    170         *
    171         * @param       out     OutputStreamオブジェクト
    172         *
    173         * @return      ストリームに書き出したバイト数
    174         * @throws  IOException 入出力エラーが発生したとき
    175         */
    176        long write( final OutputStream out ) throws IOException {
    177                // decode macbinary if this was sent
    178                long size=0;
    179                int read;
    180                byte[] buf = new byte[8 * 1024];
    181                while((read = partInput.read(buf)) != -1) {
    182                        out.write(buf, 0, read);
    183                        size += read;
    184                }
    185                return size;
    186        }
    187
    188        /**
    189         * ファイルかどうか
    190         *
    191         * @return      (常に true)
    192         */
    193        @Override
    194        public boolean isFile() {
    195                return true;
    196        }
    197}