Skip to content

Commit 1b6a7d7

Browse files
author
wqingzhang9836
committed
图片上传时处理若覆盖原图则不检查Etag
1 parent 44edcfd commit 1b6a7d7

File tree

4 files changed

+36
-8
lines changed

4 files changed

+36
-8
lines changed

include/cos_api.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -773,7 +773,7 @@ class CosAPI {
773773
/** 图片持久化处理 **/
774774

775775
/*** 上传时处理 ***/
776-
CosResult PutImage(const PutImageByFileReq& req, PutImageByFileResp* resp);
776+
CosResult PutImage(PutImageByFileReq& req, PutImageByFileResp* resp);
777777

778778
/*** 云上数据处理 ***/
779779
CosResult CloudImageProcess(const CloudImageProcessReq& req,

include/request/data_process_req.h

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,8 @@ class PicOperation {
277277
PicOperation() : is_pic_info(true) {}
278278
virtual ~PicOperation() {}
279279

280+
std::vector<PicRules> GetRules() const { return rules; }
281+
280282
void AddRule(const PicRules& rule) { rules.push_back(rule); }
281283

282284
void TurnOffPicInfo() { is_pic_info = false; }
@@ -601,20 +603,20 @@ class PutImageByFileReq : public PutObjectByFileReq {
601603
PutImageByFileReq(const std::string& bucket_name,
602604
const std::string& object_name,
603605
const std::string& local_image)
604-
: PutObjectByFileReq(bucket_name, object_name, local_image) {
605-
// 图片上传时处理可能会覆盖原图,本地文件etag与上传到COS的etag文件的etag可能不一致
606-
// 这种情况是合理的,所以这里不需要检查etag
607-
TurnOffComputeConentMd5();
608-
TurnOffCheckETag();
609-
}
606+
: PutObjectByFileReq(bucket_name, object_name, local_image) {}
610607

611608
virtual ~PutImageByFileReq() {}
612609

610+
PicOperation GetPictureOperation() const { return m_pic_operation; }
611+
613612
void SetPicOperation(const PicOperation& pic_operation) {
614613
m_pic_operation = pic_operation;
615614
AddHeader("Pic-Operations", m_pic_operation.GenerateJsonString());
616615
}
617616

617+
// 检查图片处理的效果图文件是否覆盖了原图
618+
void CheckCoverOriginImage();
619+
618620
private:
619621
PicOperation m_pic_operation;
620622
};

src/cos_api.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -582,8 +582,9 @@ CosResult CosAPI::MoveObject(const MoveObjectReq& req) {
582582
return m_object_op.MoveObject(req);
583583
}
584584

585-
CosResult CosAPI::PutImage(const PutImageByFileReq& req,
585+
CosResult CosAPI::PutImage(PutImageByFileReq& req,
586586
PutImageByFileResp* resp) {
587+
req.CheckCoverOriginImage();
587588
return m_object_op.PutImage(req, resp);
588589
}
589590

src/request/data_process_req.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,31 @@
77

88
namespace qcloud_cos {
99

10+
void PutImageByFileReq:: CheckCoverOriginImage() {
11+
std::vector<PicRules> pic_rules = m_pic_operation.GetRules();
12+
std::string object_name = GetObjectName();
13+
std::string object_dir = object_name.substr(0, object_name.find_last_of("/") + 1);
14+
for (std::vector<PicRules>::const_iterator c_itr = pic_rules.begin();
15+
c_itr != pic_rules.end(); ++c_itr) {
16+
const PicRules& pic_rule = *c_itr;
17+
std::string pic_absolute_key;
18+
if (StringUtil::StringStartsWith(pic_rule.fileid, "/")) {
19+
// fileid 以“/”开头为绝对路径
20+
pic_absolute_key = StringUtil::StringRemovePrefix(pic_rule.fileid, "/");
21+
} else {
22+
// fileid 不以“/”开头为相对路径
23+
pic_absolute_key = object_dir + pic_rule.fileid;
24+
}
25+
// 如果图片处理的效果图存放路径与上传文件路径相同,则会覆盖上传的原文件
26+
// 覆盖上传原文件后Etag与本地文件不相同,此时不比较Etag
27+
if (pic_absolute_key == object_name) {
28+
TurnOffCheckETag();
29+
TurnOffComputeConentMd5();
30+
break;
31+
}
32+
}
33+
}
34+
1035
bool CreateDocProcessJobsReq::GenerateRequestBody(std::string* body) const {
1136
rapidxml::xml_document<> doc;
1237
rapidxml::xml_node<>* root_node = doc.allocate_node(

0 commit comments

Comments
 (0)