1 /*
2 * Copyright 2009-2017 Alibaba Cloud All rights reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include <alibabacloud/oss/model/UploadObjectRequest.h>
18 #include <alibabacloud/oss/http/HttpType.h>
19 #include <alibabacloud/oss/Const.h>
20 #include <fstream>
21 #include "utils/Utils.h"
22 #include "../utils/FileSystemUtils.h"
23 #include "../model/ModelError.h"
24
25 using namespace AlibabaCloud::OSS;
26
UploadObjectRequest(const std::string & bucket,const std::string & key,const std::string & filePath,const std::string & checkpointDir,const uint64_t partSize,const uint32_t threadNum)27 UploadObjectRequest::UploadObjectRequest(const std::string &bucket, const std::string &key,
28 const std::string &filePath, const std::string &checkpointDir,
29 const uint64_t partSize, const uint32_t threadNum):
30 OssResumableBaseRequest(bucket, key, checkpointDir, partSize, threadNum),
31 filePath_(filePath)
32 {
33 time_t lastMtime;
34 std::streamsize fileSize;
35 isFileExist_ = true;
36 if (!GetPathInfo(filePath_, lastMtime, fileSize)) {
37 //if fail, ignore the lastmodified time.
38 lastMtime = 0;
39 fileSize = 0;
40 isFileExist_ = false;
41 }
42 mtime_ = ToGmtTime(lastMtime);
43 objectSize_ = static_cast<uint64_t>(fileSize);
44 }
45
UploadObjectRequest(const std::string & bucket,const std::string & key,const std::string & filePath,const std::string & checkpointDir,const uint64_t partSize,const uint32_t threadNum,const ObjectMetaData & meta)46 UploadObjectRequest::UploadObjectRequest(const std::string &bucket, const std::string &key,
47 const std::string &filePath, const std::string &checkpointDir,
48 const uint64_t partSize, const uint32_t threadNum, const ObjectMetaData& meta):
49 UploadObjectRequest(bucket, key, filePath, checkpointDir, partSize, threadNum)
50 {
51 metaData_ = meta;
52 }
53
UploadObjectRequest(const std::string & bucket,const std::string & key,const std::string & filePath,const std::string & checkpointDir,const ObjectMetaData & meta)54 UploadObjectRequest::UploadObjectRequest(const std::string &bucket, const std::string &key,
55 const std::string &filePath, const std::string &checkpointDir, const ObjectMetaData& meta):
56 UploadObjectRequest(bucket, key, filePath, checkpointDir, DefaultPartSize, DefaultResumableThreadNum, meta)
57 {}
58
UploadObjectRequest(const std::string & bucket,const std::string & key,const std::string & filePath,const std::string & checkpointDir)59 UploadObjectRequest::UploadObjectRequest(const std::string &bucket, const std::string &key,
60 const std::string &filePath, const std::string &checkpointDir) :
61 UploadObjectRequest(bucket, key, filePath, checkpointDir, DefaultPartSize, DefaultResumableThreadNum)
62 {}
63
UploadObjectRequest(const std::string & bucket,const std::string & key,const std::string & filePath)64 UploadObjectRequest::UploadObjectRequest(const std::string &bucket, const std::string &key,
65 const std::string &filePath):
66 UploadObjectRequest(bucket, key, filePath, "", DefaultPartSize, DefaultResumableThreadNum)
67 {}
68
69 //wstring
UploadObjectRequest(const std::string & bucket,const std::string & key,const std::wstring & filePath,const std::wstring & checkpointDir,const uint64_t partSize,const uint32_t threadNum)70 UploadObjectRequest::UploadObjectRequest(const std::string &bucket, const std::string &key,
71 const std::wstring &filePath, const std::wstring &checkpointDir,
72 const uint64_t partSize, const uint32_t threadNum) :
73 OssResumableBaseRequest(bucket, key, checkpointDir, partSize, threadNum),
74 filePathW_(filePath)
75 {
76 #ifdef _WIN32
77 time_t lastMtime;
78 std::streamsize fileSize;
79 isFileExist_ = true;
80 if (!GetPathInfo(filePathW_, lastMtime, fileSize)) {
81 //if fail, ignore the lastmodified time.
82 lastMtime = 0;
83 fileSize = 0;
84 isFileExist_ = false;
85 }
86 mtime_ = ToGmtTime(lastMtime);
87 objectSize_ = static_cast<uint64_t>(fileSize);
88 #else
89 objectSize_ = 0;
90 time_t lastMtime = 0;
91 mtime_ = ToGmtTime(lastMtime);
92 isFileExist_ = false;
93 #endif
94 }
95
UploadObjectRequest(const std::string & bucket,const std::string & key,const std::wstring & filePath,const std::wstring & checkpointDir,const uint64_t partSize,const uint32_t threadNum,const ObjectMetaData & meta)96 UploadObjectRequest::UploadObjectRequest(const std::string &bucket, const std::string &key,
97 const std::wstring &filePath, const std::wstring &checkpointDir,
98 const uint64_t partSize, const uint32_t threadNum, const ObjectMetaData& meta) :
99 UploadObjectRequest(bucket, key, filePath, checkpointDir, partSize, threadNum)
100 {
101 metaData_ = meta;
102 }
103
UploadObjectRequest(const std::string & bucket,const std::string & key,const std::wstring & filePath,const std::wstring & checkpointDir,const ObjectMetaData & meta)104 UploadObjectRequest::UploadObjectRequest(const std::string &bucket, const std::string &key,
105 const std::wstring &filePath, const std::wstring &checkpointDir, const ObjectMetaData& meta) :
106 UploadObjectRequest(bucket, key, filePath, checkpointDir, DefaultPartSize, DefaultResumableThreadNum, meta)
107 {}
108
UploadObjectRequest(const std::string & bucket,const std::string & key,const std::wstring & filePath,const std::wstring & checkpointDir)109 UploadObjectRequest::UploadObjectRequest(const std::string &bucket, const std::string &key,
110 const std::wstring &filePath, const std::wstring &checkpointDir) :
111 UploadObjectRequest(bucket, key, filePath, checkpointDir, DefaultPartSize, DefaultResumableThreadNum)
112 {}
113
UploadObjectRequest(const std::string & bucket,const std::string & key,const std::wstring & filePath)114 UploadObjectRequest::UploadObjectRequest(const std::string &bucket, const std::string &key,
115 const std::wstring &filePath) :
116 UploadObjectRequest(bucket, key, filePath, L"", DefaultPartSize, DefaultResumableThreadNum)
117 {}
118
119
setAcl(CannedAccessControlList & acl)120 void UploadObjectRequest::setAcl(CannedAccessControlList& acl)
121 {
122 metaData_.addHeader("x-oss-object-acl", ToAclName(acl));
123 }
124
setCallback(const std::string & callback,const std::string & callbackVar)125 void UploadObjectRequest::setCallback(const std::string& callback, const std::string& callbackVar)
126 {
127 metaData_.removeHeader("x-oss-callback");
128 metaData_.removeHeader("x-oss-callback-var");
129
130 if (!callback.empty()) {
131 metaData_.addHeader("x-oss-callback", callback);
132 }
133
134 if (!callbackVar.empty()) {
135 metaData_.addHeader("x-oss-callback-var", callbackVar);
136 }
137 }
138
setTagging(const std::string & value)139 void UploadObjectRequest::setTagging(const std::string& value)
140 {
141 metaData_.addHeader("x-oss-tagging", value);
142 }
143
validate() const144 int UploadObjectRequest::validate() const
145 {
146 auto ret = OssResumableBaseRequest::validate();
147 if (ret != 0) {
148 return ret;
149 }
150
151 #if !defined(_WIN32)
152 if (!filePathW_.empty()) {
153 return ARG_ERROR_PATH_NOT_SUPPORT_WSTRING_TYPE;
154 }
155 #endif
156
157 //path and checkpoint must be same type.
158 if ((!filePath_.empty() && !checkpointDirW_.empty()) ||
159 (!filePathW_.empty() && !checkpointDir_.empty())) {
160 return ARG_ERROR_PATH_NOT_SAME_TYPE;
161 }
162
163 if (!isFileExist_) {
164 return ARG_ERROR_OPEN_UPLOAD_FILE;
165 }
166
167 return 0;
168 }
169