    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.IOException;
    019import java.io.InputStream;
    020import java.io.OutputStream;
    021
    022import javax.servlet.ServletInputStream;
    023
    024import org.opengion.fukurou.model.FileOperation;
    025import org.opengion.hayabusa.io.HybsFileOperationFactory;
    026
    027/**
    028 * ファイルアップロード時のマルチパート処理のファイルパート部品です。
    029 *
    030 * ファイル情報を取り扱います。
    031 *
    032 * @og.rev 5.10.9.0 (2019/03/01) oota クラウドストレージ対応を追加。(Fileクラスを拡張)
    033 *
    034 * @og.group その他機能
    035 *
    036 * @version  4.0
    037 * @author   Kazuhiko Hasegawa
    038 * @since    JDK5.0,
    039 */
    040public class FilePart extends Part {
    041
    042        private String filename;
    043        private final String filePath;
    044        private final String contentType;
    045        private final PartInputStream partInput;
    046
    047        /**
    048         * ファイルパート部品 オブジェクトを構築する、コンストラクター
    049         *
    050         * @param       name            Part名称
    051         * @param       in                      ServletInputStreamオブジェクト
    052         * @param       boundary        境界文字
    053         * @param       contentType     コンテンツタイプ
    054         * @param       filename        ファイル名
    055         * @param       filePath        ファイルパス
    056         * @throws IOException 入出力エラーが発生したとき
    057         */
    058        FilePart( final String name, final ServletInputStream in, final String boundary,
    059                        final String contentType, final String filename, final String filePath)
    060                                                                                        throws IOException {
    061                super(name);
    062                this.filename = filename;
    063                this.filePath = filePath;
    064                this.contentType = contentType;
    065                partInput = new PartInputStream(in, boundary);
    066        }
    067
    068        /**
    069         * ファイル名を取得します。
    070         *
    071         * @return      ファイル名
    072         */
    073        public String getFilename() {
    074                return filename;
    075        }
    076
    077        /**
    078         * ファイル名をセットします。
    079         *
    080         * @param  fname ファイル名
    081         */
    082        public void setFilename( final String fname ) {
    083                filename = fname ;
    084        }
    085
    086        /**
    087         * ファイルパスを取得します。
    088         *
    089         * @return      ファイルパス
    090         */
    091        public String getFilePath() {
    092                return filePath;
    093        }
    094
    095        /**
    096         * コンテンツタイプを取得します。
    097         *
    098         * @return      コンテンツタイプ
    099         */
    100        public String getContentType() {
    101                return contentType;
    102        }
    103
    104        /**
    105         * 入力ストリームを取得します。
    106         *
    107         * @return      入力ストリーム
    108         */
    109        public InputStream getInputStream() {
    110                return partInput;
    111        }
    112
    113        /**
    114         * 指定のファイルに書き出します。
    115         *
    116         * @og.rev 5.10.9.0 (2019/03/01) クラウドストレージ対応を追加。引数にstorageType,bucketNameを追加。
    117         *
    118         * @param       fileOrDirectory 出力先ファイル名/ディレクトリ名
    119         * @param  storageType ストレージタイプ
    120         * @param       bucketName      バケット名
    121         *
    122         * @return      ストリームに書き出したバイト数
    123         * @throws IOException 入出力エラーが発生したとき
    124         */
    125        // 5.10.9.0 (2019/03/01) MODIFY
    126//      public long writeTo( final File fileOrDirectory ) throws IOException {
    127        public long writeTo( final FileOperation fileOrDirectory, String storageType, String bucketName ) throws IOException {
    128                long written = 0;
    129
    130                // Only do something if this part contains a file
    131                if(filename != null) {
    132                        // Check if user supplied directory
    133                        // 5.10.9.0 (2019/03/01) MODIFY
    134//                      File file;
    135                        FileOperation file;
    136                        // 5.10.9.0 (2019/03/01) MODIFY not isFileの条件を追加。(クラウドストレージの場合、初回はどちらもfalseになるため)
    137//                      if(fileOrDirectory.isDirectory()) {
    138                        if(fileOrDirectory.isDirectory() || !fileOrDirectory.isFile()) {
    139                                // Write it to that dir the user supplied,
    140                                // with the filename it arrived with
    141                                // 5.10.9.0 (2019/03/01) MODIFY
    142//                              file = new File(fileOrDirectory, filename);
    143                                file = HybsFileOperationFactory.create(storageType, bucketName, fileOrDirectory, filename);
    144                        }
    145                        else {
    146                                // Write it to the file the user supplied,
    147                                // ignoring the filename it arrived with
    148                                file = fileOrDirectory;
    149                        }
    150                        // 5.10.9.0 (2019/03/01) MODIFY FileOperationクラスを利用して、書き込み処理を行う。
    151//                      fileOut = new BufferedOutputStream(new FileOutputStream(file));
    152//                      written = write(fileOut);
    153                        file.write(partInput);
    154                        written = file.length();
    155                }
    156
    157                return written;
    158        }
    159
    160        /**
    161         * 指定のストリームに書き出します。
    162         *
    163         * @param       out     OutputStreamオブジェクト
    164         *
    165         * @return      ストリームに書き出したバイト数
    166         * @throws  IOException 入出力エラーが発生したとき
    167         */
    168        long write( final OutputStream out ) throws IOException {
    169                // decode macbinary if this was sent
    170                long size=0;
    171                int read;
    172                byte[] buf = new byte[8 * 1024];
    173                while((read = partInput.read(buf)) != -1) {
    174                        out.write(buf, 0, read);
    175                        size += read;
    176                }
    177                return size;
    178        }
    179
    180        /**
    181         * ファイルかどうか
    182         *
    183         * @return      (常に true)
    184         */
    185        @Override
    186        public boolean isFile() {
    187                return true;
    188        }
    189}