Skip to content

Commit 45e4472

Browse files
sabrioUncleDave
authored andcommitted
feat: retrieve files on open (#130)
fixes 12
1 parent a3088d9 commit 45e4472

File tree

6 files changed

+90
-15
lines changed

6 files changed

+90
-15
lines changed

demo/src/app/demo/components/demo.component.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@
44
<customise></customise>
55
<events></events>
66
<styles></styles>
7+
<uploaded></uploaded>
78
</div>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<h4 class="mb-3 mt-3">Uploaded Usage</h4>
2+
3+
<image-upload
4+
url="https://httpbin.org/status/200"
5+
[uploadedFiles]="images"
6+
(removed)="onRemoved($event)"
7+
></image-upload>
8+
9+
<pre><code class="language-markup"><![CDATA[<image-upload url="https://httpbin.org/status/200" [uploadedFiles]="images"></image-upload>]]></code></pre>
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { Component } from '@angular/core';
2+
3+
@Component({
4+
selector: 'uploaded',
5+
templateUrl: './uploaded.component.html'
6+
})
7+
export class UploadedExampleComponent {
8+
myHeaders: { [name: string]: any } = {
9+
'Authorization': 'MyToken',
10+
'Another Header': 'AnotherValue'
11+
};
12+
13+
images = [];
14+
15+
onRemoved(event){
16+
console.log(event);
17+
}
18+
19+
ngOnInit(){
20+
setTimeout(()=>{
21+
this.images = [
22+
'https://static.independent.co.uk/s3fs-public/styles/story_medium/public/thumbnails/image/2016/10/11/14/beats-logo-1200-80.jpg',
23+
'https://s-media-cache-ak0.pinimg.com/originals/68/fb/c7/68fbc7bc9eb8c530c6e804c4109ec647.jpg',
24+
{fileName: 'google-image.jpg', url: 'https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png'}
25+
];
26+
}, 1000);
27+
}
28+
}

demo/src/app/demo/demo.module.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { DemoComponent } from './components/demo.component';
77
import { EventsComponent } from './components/events/events.component';
88
import { FilterExampleComponent } from './components/filter/filter.component';
99
import { StyleComponent } from './components/style/style.component';
10+
import {UploadedExampleComponent} from "./components/uploaded/uploaded.component";
1011

1112
@NgModule({
1213
declarations: [
@@ -15,7 +16,8 @@ import { StyleComponent } from './components/style/style.component';
1516
FilterExampleComponent,
1617
CustomiseComponent,
1718
EventsComponent,
18-
StyleComponent
19+
StyleComponent,
20+
UploadedExampleComponent
1921
],
2022
imports: [
2123
ImageUploadModule

demo/src/assets/readme.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ Content-Type. The query has a single field called `image`.
4343

4444
`[extensions]="['jpg','png','gif']"` - upload images with specific extensions. Default all extensions `image/*` is allowed.
4545

46+
`[uploadedFiles]="['http://example.com/path/to/my/file', {'fileName': 'fileName.jpg', url: 'http://example.com/path/to/my/file'}]"` - enters the uploaded files from the previous time.
47+
4648
#### Custom headers
4749

4850
If you need to send some headers with your request (for example `Authorization` headers),
@@ -149,6 +151,7 @@ In the final state it should look something like this:
149151
[buttonCaption]="'Select Images!'"
150152
[dropBoxMessage]="'Drop your images here!'"
151153
[extensions]="['jpg','png','gif']"
154+
[uploadedFiles]="['http://example.com/path/to/my/file']"
152155
[class]="'customClass'"
153156
(removed)="onRemoved($event)"
154157
(uploadFinished)="onUploadFinished($event)"
@@ -160,3 +163,4 @@ In the final state it should look something like this:
160163

161164
@aberezkin
162165
@UncleDave
166+
@sabrio

src/image-upload/image-upload.component.ts

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,24 @@
1-
import { Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';
2-
import { Headers } from '@angular/http';
1+
import {Component, ElementRef, EventEmitter, Input, OnChanges, OnInit, Output, ViewChild} from '@angular/core';
2+
import {Headers} from '@angular/http';
33

4-
import { ImageService } from './image.service';
5-
import { Style } from "./style";
6-
import { UploadMetadata } from './before-upload.interface';
4+
import {ImageService} from './image.service';
5+
import {Style} from "./style";
6+
import {UploadMetadata} from './before-upload.interface';
77

88
export class FileHolder {
99
public pending: boolean = false;
1010
public serverResponse: { status: number, response: any };
1111

12-
constructor(public src: string, public file: File) { }
12+
constructor(public src: string, public file: File) {
13+
}
1314
}
1415

1516
@Component({
1617
selector: 'image-upload',
1718
templateUrl: './image-upload.component.html',
1819
styleUrls: ['./image-upload.component.css']
1920
})
20-
export class ImageUploadComponent implements OnInit {
21+
export class ImageUploadComponent implements OnInit, OnChanges {
2122

2223
files: FileHolder[] = [];
2324
fileCounter: number = 0;
@@ -39,6 +40,7 @@ export class ImageUploadComponent implements OnInit {
3940
@Input('extensions') supportedExtensions: string[];
4041
@Input() url: string;
4142
@Input() withCredentials: boolean = false;
43+
@Input() uploadedFiles: string[] | Array<{ url: string, fileName: string, blob?: Blob }> = [];
4244
@Output() removed: EventEmitter<FileHolder> = new EventEmitter<FileHolder>();
4345
@Output() uploadStateChanged: EventEmitter<boolean> = new EventEmitter<boolean>();
4446
@Output() uploadFinished: EventEmitter<FileHolder> = new EventEmitter<FileHolder>();
@@ -47,7 +49,8 @@ export class ImageUploadComponent implements OnInit {
4749
private inputElement: ElementRef;
4850
private pendingFilesCounter: number = 0;
4951

50-
constructor(private imageService: ImageService) { }
52+
constructor(private imageService: ImageService) {
53+
}
5154

5255
ngOnInit() {
5356
if (!this.fileTooLargeMessage) {
@@ -71,6 +74,12 @@ export class ImageUploadComponent implements OnInit {
7174
this.removed.emit(file);
7275
}
7376

77+
ngOnChanges(changes) {
78+
if (changes.uploadedFiles && changes.uploadedFiles.currentValue.length > 0) {
79+
this.processUploadedFiles();
80+
}
81+
}
82+
7483
onFileChange(files: FileList) {
7584
let remainingSlots = this.countRemainingSlots();
7685
let filesToUploadNum = files.length > remainingSlots ? remainingSlots : files.length;
@@ -99,6 +108,28 @@ export class ImageUploadComponent implements OnInit {
99108
}
100109
}
101110

111+
private processUploadedFiles() {
112+
for (let i = 0; i < this.uploadedFiles.length; i++) {
113+
let data: any = this.uploadedFiles[i];
114+
115+
let fileBlob: Blob,
116+
file: File,
117+
fileUrl: string;
118+
119+
if (data instanceof Object) {
120+
fileUrl = data.url;
121+
fileBlob = (data.blob) ? data.blob : new Blob([data]);
122+
file = new File([fileBlob], data.fileName);
123+
} else {
124+
fileUrl = data;
125+
fileBlob = new Blob([fileUrl]);
126+
file = new File([fileBlob], fileUrl);
127+
}
128+
129+
this.files.push(new FileHolder(fileUrl, file));
130+
}
131+
}
132+
102133
private async uploadFiles(files: FileList, filesToUploadNum: number) {
103134
for (let i = 0; i < filesToUploadNum; i++) {
104135
const file = files[i];
@@ -110,7 +141,7 @@ export class ImageUploadComponent implements OnInit {
110141
continue;
111142
}
112143

113-
const beforeUploadResult: UploadMetadata = await this.beforeUpload({ file, url: this.url, abort: false });
144+
const beforeUploadResult: UploadMetadata = await this.beforeUpload({file, url: this.url, abort: false});
114145

115146
if (beforeUploadResult.abort) {
116147
this.fileCounter--;
@@ -139,11 +170,11 @@ export class ImageUploadComponent implements OnInit {
139170
this.imageService
140171
.postImage(this.url, fileHolder.file, this.headers, this.partName, customForm, this.withCredentials)
141172
.subscribe(
142-
response => this.onResponse(response, fileHolder),
143-
error => {
144-
this.onResponse(error, fileHolder);
145-
this.deleteFile(fileHolder);
146-
});
173+
response => this.onResponse(response, fileHolder),
174+
error => {
175+
this.onResponse(error, fileHolder);
176+
this.deleteFile(fileHolder);
177+
});
147178
} else {
148179
this.uploadFinished.emit(fileHolder);
149180
}

0 commit comments

Comments
 (0)