Skip to content

Commit 2945b7c

Browse files
update all
1 parent 1cfb7e0 commit 2945b7c

File tree

12 files changed

+130
-99
lines changed

12 files changed

+130
-99
lines changed

ASP.NET Core/wwwroot/js/amazon.gateway.js

Lines changed: 38 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,18 @@ class AmazonGateway {
1111
return `${this.baseUrl}/${methodName}`;
1212
}
1313

14+
logRequest(method, url, requestUrl) {
15+
if (!this.onRequestExecuted) {
16+
return;
17+
}
18+
const params = {
19+
method,
20+
urlPath: requestUrl,
21+
queryString: url.toString().replace(requestUrl, ''),
22+
};
23+
this.onRequestExecuted(params);
24+
}
25+
1426
removeUploadData(fileName) {
1527
delete this.uploadData[fileName];
1628
}
@@ -142,16 +154,33 @@ class AmazonGateway {
142154
return this.makeRequest('getPresignedDownloadUrl', params, requestOptions);
143155
}
144156

145-
logRequest(method, url, requestUrl) {
146-
if (!this.onRequestExecuted) {
147-
return;
157+
async makeRequest(method, queryParams, requestParams) {
158+
const requestUrl = this.getRequestUrl(method);
159+
const url = new URL(requestUrl);
160+
161+
Object.keys(queryParams).forEach((key) => url.searchParams.append(key, queryParams[key]));
162+
this.logRequest(method, url, requestUrl);
163+
164+
try {
165+
const response = await fetch(url.toString(), requestParams);
166+
if (!response.ok) {
167+
const errorMessage = await response.text();
168+
throw new Error(errorMessage);
169+
}
170+
return await this.getResponseData(response);
171+
} catch (error) {
172+
throw new Error(error.message);
148173
}
149-
const params = {
150-
method,
151-
urlPath: requestUrl,
152-
queryString: url.toString().replace(requestUrl, ''),
153-
};
154-
this.onRequestExecuted(params);
174+
}
175+
176+
async getResponseData(response) {
177+
if (this.containsAttachment(response)) {
178+
return response.blob();
179+
}
180+
if (this.containsPlainText(response)) {
181+
return response.text();
182+
}
183+
return response.json();
155184
}
156185

157186
containsAttachment(response) {
@@ -169,29 +198,4 @@ class AmazonGateway {
169198
}
170199
return false;
171200
}
172-
173-
async makeRequest(method, queryParams, requestParams) {
174-
const requestUrl = this.getRequestUrl(method);
175-
const url = new URL(requestUrl);
176-
177-
Object.keys(queryParams).forEach((key) => url.searchParams.append(key, queryParams[key]));
178-
this.logRequest(method, url, requestUrl);
179-
180-
try {
181-
const response = await fetch(url.toString(), requestParams);
182-
if (!response.ok) {
183-
const errorMessage = await response.text();
184-
throw new Error(errorMessage);
185-
}
186-
if (this.containsAttachment(response)) {
187-
return response.blob();
188-
}
189-
if (this.containsPlainText(response)) {
190-
return response.text();
191-
}
192-
return response.json();
193-
} catch (error) {
194-
throw new Error(error.message);
195-
}
196-
}
197201
}

Amazon_Backend/AmazonS3_Backend/Controllers/AmazonS3Controller.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,16 @@ public async Task<IActionResult> GetPresignedUrl(string uploadId, string key, in
100100
}
101101
}
102102

103+
[HttpPost("getPresignedDownloadUrl")]
104+
public async Task<IActionResult> GetPresignedDownloadUrl(string key) {
105+
try {
106+
var presignedDownloadUrl = await provider.GetPresignedDownloadUrlAsync(key);
107+
return Ok(presignedDownloadUrl);
108+
} catch (Exception ex) {
109+
return StatusCode(500, ex.Message);
110+
}
111+
}
112+
103113
[HttpPost("uploadPart")]
104114
public async Task<IActionResult> UploadPart([FromForm] IFormFile part, [FromForm] int partNumber, [FromForm] long partSize, [FromForm] string fileName, [FromForm] string uploadId) {
105115
try {
@@ -119,6 +129,9 @@ public async Task<IActionResult> CompleteUpload([FromBody] List<PartETag> parts,
119129
var response = await provider.CompleteUploadAsync(key, uploadId, parts);
120130
// use `response` if you need to pass ETag or something else when upload is finished
121131
return Ok(response.ETag);
132+
} catch (AmazonS3Exception ex) when (ex.StatusCode == System.Net.HttpStatusCode.NotFound) {
133+
// abort is requested when upload is being completed
134+
return Ok();
122135
} catch (Exception ex) {
123136
return StatusCode(500, ex.Message);
124137
}

Amazon_Backend/AmazonS3_Backend/Providers/AmazonS3Provider.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,16 @@ public async Task<string> GetPresignedUrlAsync(string uploadId, string key, int
304304

305305
return await Client.GetPreSignedURLAsync(request);
306306
}
307+
public async Task<string> GetPresignedDownloadUrlAsync(string key) {
308+
var request = new GetPreSignedUrlRequest {
309+
BucketName = BucketName,
310+
Key = key,
311+
Expires = DateTime.Now.AddSeconds(300),
312+
Protocol = Protocol.HTTPS
313+
};
314+
315+
return await Client.GetPreSignedURLAsync(request);
316+
}
307317
public async Task<CompleteMultipartUploadResponse> CompleteUploadAsync(string key, string uploadId, List<PartETag> parts) {
308318
var request = new CompleteMultipartUploadRequest() {
309319
BucketName = BucketName,

Angular/src/app/services/amazon.filesystem.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,11 @@ export class AmazonFileSystem {
6060
return key.substring(index + 1);
6161
}
6262

63-
async abortFileUpload(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem): Promise<any> {
63+
async abortFileUpload(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem | undefined): Promise<any> {
6464
await this.gateway.abortFileUpload(fileData, uploadInfo, destinationDirectory);
6565
}
6666

67-
async uploadFileChunk(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem): Promise<any> {
67+
async uploadFileChunk(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem | undefined): Promise<any> {
6868
try {
6969
if (uploadInfo.chunkIndex === 0) {
7070
await this.gateway.initUpload(fileData, destinationDirectory);

Angular/src/app/services/amazon.gateway.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,8 @@ export class AmazonGateway {
107107
return this.makeRequest('getPresignedDownloadUrl', params, requestOptions);
108108
}
109109

110-
async initUpload(fileData: File, destinationDirectory: FileSystemItem): Promise<any> {
111-
const params = { key: `${destinationDirectory.key}${fileData.name}` };
110+
async initUpload(fileData: File, destinationDirectory: FileSystemItem | undefined): Promise<any> {
111+
const params = { key: `${destinationDirectory?.key ?? ''}${fileData.name}` };
112112
const requestOptions = {
113113
method: 'POST',
114114
headers: this.defaultHeaders,
@@ -118,9 +118,9 @@ export class AmazonGateway {
118118
this.initUploadData(params.key, uploadId);
119119
}
120120

121-
async uploadPart(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem): Promise<any> {
121+
async uploadPart(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem | undefined): Promise<any> {
122122
const params = {};
123-
const key = `${destinationDirectory.key}${fileData.name}`;
123+
const key = `${destinationDirectory?.key ?? ''}${fileData.name}`;
124124

125125
const data = new FormData();
126126
data.append('part', uploadInfo.chunkBlob);
@@ -139,8 +139,8 @@ export class AmazonGateway {
139139
this.addPartToUploadData(key, { PartNumber: uploadInfo.chunkIndex + 1, ETag: etag });
140140
}
141141

142-
async completeUpload(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem): Promise<any> {
143-
const key = `${destinationDirectory.key}${fileData.name}`;
142+
async completeUpload(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem | undefined): Promise<any> {
143+
const key = `${destinationDirectory?.key ?? ''}${fileData.name}`;
144144
const params = {
145145
key,
146146
uploadId: this.getUploadId(key),
@@ -155,7 +155,7 @@ export class AmazonGateway {
155155
this.removeUploadData(key);
156156
}
157157

158-
async abortFileUpload(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem): Promise<any> {
158+
async abortFileUpload(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem | undefined): Promise<any> {
159159
const key = `${destinationDirectory?.key ?? ''}${fileData.name}`;
160160
const uploadId = this.getUploadId(fileData.name);
161161
const params = { uploadId, key };

React/src/api/amazon.custom.provider.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export class AmazonCustomProvider {
7979
}
8080
};
8181

82-
uploadFileChunk = async (fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem): Promise<void> => {
82+
uploadFileChunk = async (fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem | undefined): Promise<void> => {
8383
try {
8484
await this.amazon.uploadFileChunk(fileData, uploadInfo, destinationDirectory);
8585
} catch (error: any) {
@@ -96,7 +96,7 @@ export class AmazonCustomProvider {
9696
}
9797
};
9898

99-
abortFileUpload = async (fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem): Promise<void> => {
99+
abortFileUpload = async (fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem | undefined): Promise<void> => {
100100
try {
101101
await this.amazon.abortFileUpload(fileData, uploadInfo, destinationDirectory);
102102
} catch (error: any) {

React/src/api/amazon.filesystem.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,11 @@ export class AmazonFileSystem {
6060
return key.substring(index + 1);
6161
}
6262

63-
async abortFileUpload(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem): Promise<any> {
63+
async abortFileUpload(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem | undefined): Promise<any> {
6464
await this.gateway.abortFileUpload(fileData, uploadInfo, destinationDirectory);
6565
}
6666

67-
async uploadFileChunk(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem): Promise<any> {
67+
async uploadFileChunk(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem | undefined): Promise<any> {
6868
try {
6969
if (uploadInfo.chunkIndex === 0) {
7070
await this.gateway.initUpload(fileData, destinationDirectory);

React/src/api/amazon.gateway.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,8 @@ export class AmazonGateway {
107107
return this.makeRequest('getPresignedDownloadUrl', params, requestOptions);
108108
}
109109

110-
async initUpload(fileData: File, destinationDirectory: FileSystemItem): Promise<any> {
111-
const params = { key: `${destinationDirectory.key}${fileData.name}` };
110+
async initUpload(fileData: File, destinationDirectory: FileSystemItem | undefined): Promise<any> {
111+
const params = { key: `${destinationDirectory?.key ?? ''}${fileData.name}` };
112112
const requestOptions = {
113113
method: 'POST',
114114
headers: this.defaultHeaders,
@@ -118,9 +118,9 @@ export class AmazonGateway {
118118
this.initUploadData(params.key, uploadId);
119119
}
120120

121-
async uploadPart(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem): Promise<any> {
121+
async uploadPart(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem | undefined): Promise<any> {
122122
const params = {};
123-
const key = `${destinationDirectory.key}${fileData.name}`;
123+
const key = `${destinationDirectory?.key ?? ''}${fileData.name}`;
124124

125125
const data = new FormData();
126126
data.append('part', uploadInfo.chunkBlob);
@@ -139,8 +139,8 @@ export class AmazonGateway {
139139
this.addPartToUploadData(key, { PartNumber: uploadInfo.chunkIndex + 1, ETag: etag });
140140
}
141141

142-
async completeUpload(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem): Promise<any> {
143-
const key = `${destinationDirectory.key}${fileData.name}`;
142+
async completeUpload(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem | undefined): Promise<any> {
143+
const key = `${destinationDirectory?.key ?? ''}${fileData.name}`;
144144
const params = {
145145
key,
146146
uploadId: this.getUploadId(key),
@@ -155,7 +155,7 @@ export class AmazonGateway {
155155
this.removeUploadData(key);
156156
}
157157

158-
async abortFileUpload(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem): Promise<any> {
158+
async abortFileUpload(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem | undefined): Promise<any> {
159159
const key = `${destinationDirectory?.key ?? ''}${fileData.name}`;
160160
const uploadId = this.getUploadId(fileData.name);
161161
const params = { uploadId, key };

Vue/src/api/amazon.custom.provider.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export class AmazonCustomProvider {
7979
}
8080
};
8181
/* eslint-disable-next-line vue/max-len */
82-
uploadFileChunk = async(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem): Promise<void> => {
82+
uploadFileChunk = async(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem | undefined): Promise<void> => {
8383
try {
8484
await this.amazon.uploadFileChunk(fileData, uploadInfo, destinationDirectory);
8585
} catch (error: any) {
@@ -96,7 +96,7 @@ export class AmazonCustomProvider {
9696
}
9797
};
9898
/* eslint-disable-next-line vue/max-len */
99-
abortFileUpload = async(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem): Promise<void> => {
99+
abortFileUpload = async(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem | undefined): Promise<void> => {
100100
try {
101101
await this.amazon.abortFileUpload(fileData, uploadInfo, destinationDirectory);
102102
} catch (error: any) {

Vue/src/api/amazon.filesystem.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,11 @@ export class AmazonFileSystem {
6060
return key.substring(index + 1);
6161
}
6262
/* eslint-disable-next-line vue/max-len */
63-
async abortFileUpload(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem): Promise<any> {
63+
async abortFileUpload(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem | undefined): Promise<any> {
6464
await this.gateway.abortFileUpload(fileData, uploadInfo, destinationDirectory);
6565
}
6666
/* eslint-disable-next-line vue/max-len */
67-
async uploadFileChunk(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem): Promise<any> {
67+
async uploadFileChunk(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem | undefined): Promise<any> {
6868
try {
6969
if (uploadInfo.chunkIndex === 0) {
7070
await this.gateway.initUpload(fileData, destinationDirectory);

Vue/src/api/amazon.gateway.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,8 @@ export class AmazonGateway {
107107
return this.makeRequest('getPresignedDownloadUrl', params, requestOptions);
108108
}
109109

110-
async initUpload(fileData: File, destinationDirectory: FileSystemItem): Promise<any> {
111-
const params = { key: `${destinationDirectory.key}${fileData.name}` };
110+
async initUpload(fileData: File, destinationDirectory: FileSystemItem | undefined): Promise<any> {
111+
const params = { key: `${destinationDirectory?.key ?? ''}${fileData.name}` };
112112
const requestOptions = {
113113
method: 'POST',
114114
headers: this.defaultHeaders,
@@ -118,9 +118,9 @@ export class AmazonGateway {
118118
this.initUploadData(params.key, uploadId);
119119
}
120120
/* eslint-disable-next-line vue/max-len */
121-
async uploadPart(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem): Promise<any> {
121+
async uploadPart(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem | undefined): Promise<any> {
122122
const params = {};
123-
const key = `${destinationDirectory.key}${fileData.name}`;
123+
const key = `${destinationDirectory?.key ?? ''}${fileData.name}`;
124124

125125
const data = new FormData();
126126
data.append('part', uploadInfo.chunkBlob);
@@ -139,8 +139,8 @@ export class AmazonGateway {
139139
this.addPartToUploadData(key, { PartNumber: uploadInfo.chunkIndex + 1, ETag: etag });
140140
}
141141
/* eslint-disable-next-line vue/max-len */
142-
async completeUpload(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem): Promise<any> {
143-
const key = `${destinationDirectory.key}${fileData.name}`;
142+
async completeUpload(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem | undefined): Promise<any> {
143+
const key = `${destinationDirectory?.key ?? ''}${fileData.name}`;
144144
const params = {
145145
key,
146146
uploadId: this.getUploadId(key),
@@ -155,7 +155,7 @@ export class AmazonGateway {
155155
this.removeUploadData(key);
156156
}
157157
/* eslint-disable-next-line vue/max-len */
158-
async abortFileUpload(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem): Promise<any> {
158+
async abortFileUpload(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem | undefined): Promise<any> {
159159
const key = `${destinationDirectory?.key ?? ''}${fileData.name}`;
160160
const uploadId = this.getUploadId(fileData.name);
161161
const params = { uploadId, key };

0 commit comments

Comments
 (0)