Skip to content

Commit

Permalink
fixed issue #34: Increased upload image size, added image compression…
Browse files Browse the repository at this point in the history
… and functionality to remove image metadata
  • Loading branch information
NdibeRaymond committed Jan 20, 2021
1 parent 4f0052b commit fcf3c30
Show file tree
Hide file tree
Showing 5 changed files with 187 additions and 31 deletions.
27 changes: 27 additions & 0 deletions zubhub_frontend/zubhub/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions zubhub_frontend/zubhub/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"@testing-library/react": "^11.1.2",
"@testing-library/user-event": "^12.2.2",
"aws-sdk": "^2.813.0",
"compressorjs": "^1.0.7",
"date-fns": "^2.16.1",
"formik": "^2.2.5",
"nanoid": "^3.1.20",
Expand All @@ -26,6 +27,7 @@
"redux-thunk": "^2.3.0",
"slick-carousel": "^1.8.1",
"web-vitals": "^0.2.4",
"workerize-loader": "^1.3.0",
"yup": "^0.29.3"
},
"scripts": {
Expand Down
35 changes: 35 additions & 0 deletions zubhub_frontend/zubhub/src/assets/js/Compressor.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import Compressor from "compressorjs";



const Compress = (images,setImages) => {
let compressed = [];

for (let index = 0; index < images.length; index += 1) {
let image = images[index];

if (image) {
new Compressor(image, {
quality: 0.6,
convertSize: 100000,
success: (result) => {
compressed.push(result);
shouldSetImages(compressed, images, setImages);
},
error: (error) => {
console.warn(error.message);
compressed.push(image);
shouldSetImages(compressed, images, setImages);
},
})
}
}
};

const shouldSetImages = (compressed, images, setImages) =>{
if(compressed.length === images.length){
setImages(compressed);
}
}

export default Compress
69 changes: 69 additions & 0 deletions zubhub_frontend/zubhub/src/assets/js/removeMetaDataWorker.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
export const removeMetaData =(imageArr)=>{
let newImageArr = [];

for(let index=0; index < imageArr.length; index++){
let fr = new FileReader();
fr.onload = process;
fr.mainFile = imageArr[index];
fr.readAsArrayBuffer(imageArr[index]);
}

function process(){
let dv = new DataView(this.result);
let offset = 0, recess = 0;
let pieces = [];
let i = 0;
if (dv.getUint16(offset) === 0xffd8){
offset += 2;
let app1 = dv.getUint16(offset);
offset += 2;
while (offset < dv.byteLength){
if (app1 === 0xffe1){

pieces[i] = {recess:recess,offset:offset-2};
recess = offset + dv.getUint16(offset);
i++;
}
else if (app1 === 0xffda){
break;
}
offset += dv.getUint16(offset);
app1 = dv.getUint16(offset);
offset += 2;
}

if (pieces.length > 0){
let newPieces = [];
pieces.forEach(function(v){
newPieces.push(this.result.slice(v.recess, v.offset));
}, this);
newPieces.push(this.result.slice(recess));
newImageArr.push(new Blob(newPieces, {type: imageArr[newImageArr.length].type}));

if(newImageArr.length === imageArr.length){
postMessage(newImageArr);
}

}
else {
newImageArr.push(this.mainFile);

if(newImageArr.length === imageArr.length){
postMessage(newImageArr);
}
}
}
else {
newImageArr.push(this.mainFile);

if(newImageArr.length === imageArr.length){
postMessage(newImageArr);
}
}


}

}


Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import ErrorPage from "../../infos/ErrorPage";
import clsx from "clsx";
import PropTypes from "prop-types";
import DO, { doConfig } from "../../../../assets/js/DO";
import worker from "workerize-loader!../../../../assets/js/removeMetaDataWorker"; // eslint-disable-line import/no-webpack-loader-syntax
import Compressor from "../../../../assets/js/Compressor";
import { nanoid } from "nanoid";
import { withStyles, fade } from "@material-ui/core/styles";
import Grid from "@material-ui/core/Grid";
Expand Down Expand Up @@ -164,7 +166,7 @@ class CreateProject extends Component {
materials_used: [],
image_upload: {
upload_dialog: false,
images_to_upload: 0,
images_to_upload: [],
successful_uploads: 0,
upload_info: {},
upload_percent: 0,
Expand Down Expand Up @@ -225,7 +227,7 @@ class CreateProject extends Component {

this.setState({ image_upload }, () => {
if (
this.state.image_upload.images_to_upload ===
this.state.image_upload.images_to_upload.length ===
this.state.image_upload.successful_uploads
) {
this.upload_project();
Expand Down Expand Up @@ -272,50 +274,41 @@ class CreateProject extends Component {
if (!this.props.auth.token) {
this.props.history.push("/login");
} else {
let media_fields = this.mediaFieldsValidation();
let { image_upload } = this.state;
let media_fields = this.mediaFieldsValidation(
image_upload.images_to_upload
);

if (media_fields.image_is_empty && media_fields.video_is_empty) {
this.props.setErrors({
project_images: "you must provide either image(s) or video url",
});
this.props.setErrors({
video: "you must provide either image(s) or video url",
});
} else if (media_fields.too_many_images === true) {
this.props.setErrors({ project_images: "too many images uploaded" });
} else if (media_fields.image_size_too_large === true) {
this.props.setErrors({
project_images: "one or more of your image is greater than 3mb",
});
if (media_fields.image_is_empty && Object.keys(media_fields).length > 1) {
return;
} else if (media_fields.image_is_empty) {
this.upload_project();
} else {
let project_images = document.querySelector("#project_images").files;

let { image_upload } = this.state;
image_upload.images_to_upload = project_images.length;
image_upload.upload_dialog = true;
image_upload.upload_percent = 0;
this.setState({ image_upload });

for (let index = 0; index < project_images.length; index++) {
this.upload(project_images[index]);
for (
let index = 0;
index < image_upload.images_to_upload.length;
index++
) {
this.upload(image_upload.images_to_upload[index]);
}
}
}
};

mediaFieldsValidation = () => {
mediaFieldsValidation = (images) => {
let image_upload_button = document.querySelector("#image_upload_button");
let media_fields = document.querySelector("#project_images");
let video = document.querySelector("#video");
let imageCount = document.querySelector(".imageCountStyle");
imageCount.innerText = media_fields.files.length;
imageCount.innerText = images.length;
imageCount.style.fontSize = "0.8rem";

let result = {};

if (media_fields.files.length < 1) {
if (images.length < 1) {
result["image_is_empty"] = true;
if (video.value === "") {
image_upload_button.setAttribute(
Expand All @@ -330,7 +323,7 @@ class CreateProject extends Component {
});
result["video_is_empty"] = true;
}
} else if (media_fields.files.length > 10) {
} else if (images.length > 10) {
image_upload_button.setAttribute(
"style",
"border-color:#F54336; color:#F54336"
Expand All @@ -340,8 +333,8 @@ class CreateProject extends Component {
} else {
let image_size_too_large = false;

for (let index = 0; index < media_fields.files.length; index++) {
if (media_fields.files[index].size / 1000 > 3072) {
for (let index = 0; index < images.length; index++) {
if (images[index].size / 1000 > 10240) {
image_size_too_large = true;
}
}
Expand All @@ -351,7 +344,7 @@ class CreateProject extends Component {
"border-color:#F54336; color:#F54336"
);
this.props.setErrors({
project_images: "one or more of your image is greater than 3mb",
project_images: "one or more of your image is greater than 10mb",
});
result["image_size_too_large"] = image_size_too_large;
}
Expand All @@ -366,6 +359,36 @@ class CreateProject extends Component {
return result;
};

handleImageFieldChange = (e) => {
e.preventDefault();
let images = document.querySelector("#project_images");
let media_fields = this.mediaFieldsValidation(images.files);

if (
Object.keys(media_fields).length === 0 ||
(!(Object.keys(media_fields).length === 1) && media_fields.video_is_empty)
) {
console.log(images.files);

this.removeMetaData(images.files);
}
};

removeMetaData = (images) => {
const newWorker = worker();
newWorker.removeMetaData(images);
newWorker.addEventListener("message", (e) => {
Compressor(e.data, this.setImages);
});
};

setImages = (compressed) => {
let { image_upload } = this.state;
image_upload.images_to_upload = compressed;

this.setState({ image_upload });
};

handleImageButtonClick = () => {
document.querySelector("#project_images").click();
this.props.setFieldTouched("project_images");
Expand Down Expand Up @@ -574,7 +597,7 @@ class CreateProject extends Component {
id="project_images"
name="project_images"
multiple
onChange={this.mediaFieldsValidation}
onChange={this.handleImageFieldChange}
onBlur={this.props.handleBlur}
/>
<FormHelperText error>
Expand Down

0 comments on commit fcf3c30

Please sign in to comment.