All language subtitles for 003 Configuring Multer_Downloadly.ir_en

af Afrikaans
sq Albanian
am Amharic
ar Arabic
hy Armenian
az Azerbaijani
eu Basque
be Belarusian
bn Bengali
bs Bosnian
bg Bulgarian
ca Catalan
ceb Cebuano
ny Chichewa
zh-CN Chinese (Simplified)
zh-TW Chinese (Traditional)
co Corsican
hr Croatian
cs Czech
da Danish
nl Dutch
en English
eo Esperanto
et Estonian
tl Filipino
fi Finnish
fr French
fy Frisian
gl Galician
ka Georgian
de German
el Greek
gu Gujarati
ht Haitian Creole
ha Hausa
haw Hawaiian
iw Hebrew
hi Hindi
hmn Hmong
hu Hungarian
is Icelandic
ig Igbo
id Indonesian
ga Irish
it Italian
ja Japanese
jw Javanese
kn Kannada
kk Kazakh
km Khmer
ko Korean
ku Kurdish (Kurmanji)
ky Kyrgyz
lo Lao
la Latin
lv Latvian
lt Lithuanian
lb Luxembourgish
mk Macedonian
mg Malagasy
ms Malay
ml Malayalam
mt Maltese
mi Maori
mr Marathi
mn Mongolian
my Myanmar (Burmese)
ne Nepali
no Norwegian
ps Pashto
fa Persian Download
pl Polish
pt Portuguese
pa Punjabi
ro Romanian
ru Russian
sm Samoan
gd Scots Gaelic
sr Serbian
st Sesotho
sn Shona
sd Sindhi
si Sinhala
sk Slovak
sl Slovenian
so Somali
es Spanish
su Sundanese
sw Swahili
sv Swedish
tg Tajik
ta Tamil
te Telugu
th Thai
tr Turkish
uk Ukrainian
ur Urdu
uz Uzbek
vi Vietnamese
cy Welsh
xh Xhosa
yi Yiddish
yo Yoruba
zu Zulu
or Odia (Oriya)
rw Kinyarwanda
tk Turkmen
tt Tatar
ug Uyghur
Would you like to inspect the original subtitles? These are the user uploaded subtitles that are being translated: 1 00:00:01,090 --> 00:00:04,280 Let's now actually configure Multer to our needs. 2 00:00:04,280 --> 00:00:07,380 First giving images a better filename, 3 00:00:07,380 --> 00:00:09,990 then second allowing only image files 4 00:00:09,990 --> 00:00:12,193 to be uploaded onto our server. 5 00:00:13,880 --> 00:00:15,640 And to start, let's actually move 6 00:00:15,640 --> 00:00:17,210 all the Multer-related stuff 7 00:00:17,210 --> 00:00:19,563 from this router to the controller. 8 00:00:21,910 --> 00:00:23,633 So let's cut this here, 9 00:00:24,600 --> 00:00:27,220 and I'm gonna put it right here at the end, 10 00:00:27,220 --> 00:00:30,570 or actually at the top, all right? 11 00:00:30,570 --> 00:00:32,710 So everything related to Multer, 12 00:00:32,710 --> 00:00:35,263 we're going to put it right here at the top. 13 00:00:36,400 --> 00:00:41,400 Then we also need of course to import this Multer package. 14 00:00:44,940 --> 00:00:48,503 And now we also need to create a middleware with this. 15 00:00:53,970 --> 00:00:56,393 So exports.uploadUserPhoto 16 00:01:01,540 --> 00:01:03,253 will be equal to this. 17 00:01:05,176 --> 00:01:07,890 All right, and so we still have a middleware function, 18 00:01:07,890 --> 00:01:12,890 but now it's got its own easier to use name, all right? 19 00:01:13,950 --> 00:01:16,880 And so here, userController.uploadPhoto, all right? 20 00:01:20,460 --> 00:01:22,200 So that looks much nicer, 21 00:01:22,200 --> 00:01:23,610 and of course it makes sense 22 00:01:23,610 --> 00:01:25,950 that this code is in the controller. 23 00:01:25,950 --> 00:01:28,010 And so now this is nice and clean, 24 00:01:28,010 --> 00:01:30,790 and we can actually close it now. 25 00:01:30,790 --> 00:01:33,260 Great, and so now let's actually go ahead 26 00:01:33,260 --> 00:01:36,400 and configure our Multer upload to our needs. 27 00:01:36,400 --> 00:01:39,640 And so for that we are going to create one Multer storage 28 00:01:39,640 --> 00:01:41,950 and one Multer filter, all right? 29 00:01:41,950 --> 00:01:45,260 And then we're going to use that storage and the filter 30 00:01:45,260 --> 00:01:49,513 to then create the upload from there, all right? 31 00:01:50,400 --> 00:01:51,603 So let's do that here. 32 00:01:56,320 --> 00:02:01,053 So a multerStorage, we use multer.diskStorage. 33 00:02:03,880 --> 00:02:05,760 All right, and we could also choose 34 00:02:05,760 --> 00:02:08,560 to store the file in memory as a buffer, 35 00:02:08,560 --> 00:02:11,670 so that we could then use it later by other processes. 36 00:02:11,670 --> 00:02:14,050 And actually we're gonna do that a bit later, 37 00:02:14,050 --> 00:02:16,700 but for now of course we want to really store the file 38 00:02:16,700 --> 00:02:20,120 as it is in our file system, okay? 39 00:02:20,120 --> 00:02:23,690 So for disk storage we'll take a couple of options, 40 00:02:23,690 --> 00:02:25,693 and the first one is the destination. 41 00:02:27,900 --> 00:02:31,390 But now we cannot simply set it to this path 42 00:02:31,390 --> 00:02:32,850 like we did before. 43 00:02:32,850 --> 00:02:35,760 No, this is a bit more complex, all right? 44 00:02:35,760 --> 00:02:39,550 And so really this destination here is a callback function 45 00:02:39,550 --> 00:02:41,400 which goes like this. 46 00:02:41,400 --> 00:02:45,610 So this callback function has access to the current request, 47 00:02:45,610 --> 00:02:47,750 to the currently uploaded file, 48 00:02:47,750 --> 00:02:49,820 and also to a callback function. 49 00:02:49,820 --> 00:02:51,330 And this callback function is a bit 50 00:02:51,330 --> 00:02:53,720 like the next function in Express. 51 00:02:53,720 --> 00:02:56,810 But I'm calling it cb here, which stands for callback, 52 00:02:56,810 --> 00:02:58,790 so that it's a different name than next, 53 00:02:58,790 --> 00:03:02,000 because actually it doesn't come from Express, okay? 54 00:03:02,000 --> 00:03:05,070 But it's similar in that we can pass errors in here 55 00:03:05,070 --> 00:03:07,683 and other stuff, as you will see in a second. 56 00:03:10,830 --> 00:03:12,730 So to now define the destination, 57 00:03:12,730 --> 00:03:15,640 we actually need to call that callback. 58 00:03:15,640 --> 00:03:18,730 So callback, and then the first argument is an error 59 00:03:18,730 --> 00:03:19,820 if there is one. 60 00:03:19,820 --> 00:03:21,523 And if not, then just null. 61 00:03:22,910 --> 00:03:25,943 And the second argument is then the actual destination. 62 00:03:26,810 --> 00:03:28,260 So let's copy that from here, 63 00:03:29,180 --> 00:03:31,333 and paste it here. 64 00:03:32,500 --> 00:03:37,500 All right, and again this all looks a bit weird and complex, 65 00:03:37,820 --> 00:03:39,130 and let's actually take a look 66 00:03:39,130 --> 00:03:41,433 at the Multer documentation on GitHub. 67 00:03:48,860 --> 00:03:50,970 Okay, and so if you need to learn more, 68 00:03:50,970 --> 00:03:54,570 you can take a look at this documentation here. 69 00:03:54,570 --> 00:03:56,890 And as you see, with 6,000 stars, 70 00:03:56,890 --> 00:04:01,890 it's actually a pretty popular package. 71 00:04:02,090 --> 00:04:04,293 So here you can learn how to use it. 72 00:04:05,270 --> 00:04:07,090 But in fact what you will find here 73 00:04:07,090 --> 00:04:08,700 is kind of what we're gonna do 74 00:04:08,700 --> 00:04:11,283 throughout the next couple of lectures, okay? 75 00:04:12,290 --> 00:04:15,000 So this looks way more confusing 76 00:04:15,000 --> 00:04:17,350 than what we're going to do, all right? 77 00:04:17,350 --> 00:04:18,750 But you see that this is actually 78 00:04:18,750 --> 00:04:22,820 what we're doing currently, so we're setting the destination 79 00:04:22,820 --> 00:04:26,580 and next we will actually also set the filename. 80 00:04:26,580 --> 00:04:30,250 So let's do that, and again, if you want to learn more 81 00:04:30,250 --> 00:04:33,400 just take a look at that documentation. 82 00:04:33,400 --> 00:04:37,840 But for now I want to now set the filename property. 83 00:04:37,840 --> 00:04:41,593 So not that, simply filename. 84 00:04:42,610 --> 00:04:45,980 And again, that's a very similar callback function 85 00:04:45,980 --> 00:04:50,973 with a similar signature, request, file and callback. 86 00:04:54,540 --> 00:04:57,980 And now we want to give our files some unique filenames. 87 00:04:57,980 --> 00:04:59,380 And the way I'm going to do that 88 00:04:59,380 --> 00:05:04,380 is to call them user-userid- the current timestamp. 89 00:05:04,990 --> 00:05:07,720 So something like this: so user-, 90 00:05:07,720 --> 00:05:11,793 and then the ID which is this weird, something like this. 91 00:05:14,190 --> 00:05:16,640 Right, and then the current timestamp, 92 00:05:16,640 --> 00:05:19,880 which is going to be a huge number, something like this, 93 00:05:19,880 --> 00:05:23,490 and then of course the file extension, okay? 94 00:05:23,490 --> 00:05:25,730 And with this we can basically guarantee 95 00:05:25,730 --> 00:05:29,030 that there won't be two images with the same filename. 96 00:05:29,030 --> 00:05:31,290 If we used only the user ID, 97 00:05:31,290 --> 00:05:33,820 then of course multiple uploads by the same user 98 00:05:33,820 --> 00:05:36,140 would override the previous image. 99 00:05:36,140 --> 00:05:39,770 And if we only used user with the timestamp, well, 100 00:05:39,770 --> 00:05:43,210 then if two users were uploading an image at the same time, 101 00:05:43,210 --> 00:05:45,920 they would then get the exact same filename, 102 00:05:45,920 --> 00:05:47,393 which does not make sense. 103 00:05:48,630 --> 00:05:51,300 All right, so first of all, 104 00:05:51,300 --> 00:05:55,330 let's actually extract the filename from the uploaded file. 105 00:05:55,330 --> 00:05:57,060 And how do we get that? 106 00:05:57,060 --> 00:05:59,963 Well let's take a look at our console output here, 107 00:06:03,080 --> 00:06:06,120 where we had the request.file a long time ago. 108 00:06:06,120 --> 00:06:09,080 So here it is, so remember that this object here 109 00:06:09,080 --> 00:06:11,830 was request.file, and so that is exactly 110 00:06:11,830 --> 00:06:15,530 what this file here is, okay? 111 00:06:15,530 --> 00:06:18,260 And so here we have the mimetype, 112 00:06:18,260 --> 00:06:22,087 and so that JPEG is stored right here, okay? 113 00:06:22,087 --> 00:06:24,030 And so this is where we're gonna get 114 00:06:24,030 --> 00:06:25,363 the file extension from. 115 00:06:28,130 --> 00:06:33,130 So extension equals the file.mimetype, 116 00:06:35,290 --> 00:06:39,550 and then let's split that string by the slash, 117 00:06:39,550 --> 00:06:42,720 and take the second element of the resulting array. 118 00:06:42,720 --> 00:06:46,853 And so that will then be only this part, so only this. 119 00:06:47,780 --> 00:06:50,500 All right, so that is the extension. 120 00:06:50,500 --> 00:06:52,100 And so now just like before, 121 00:06:52,100 --> 00:06:56,760 we need to call the callback function with no error, 122 00:06:56,760 --> 00:06:59,423 and then the filename that we want to specify. 123 00:07:00,460 --> 00:07:05,460 So, that will be user-, then the user ID, remember? 124 00:07:06,890 --> 00:07:09,970 And so since we have access to the request here, 125 00:07:09,970 --> 00:07:13,913 that's very simple, request.user.id. 126 00:07:14,830 --> 00:07:16,620 And so as you know, that's the ID 127 00:07:16,620 --> 00:07:19,040 from the currently logged in user. 128 00:07:19,040 --> 00:07:24,040 Then the timestamp, so Date.now, okay, 129 00:07:25,547 --> 00:07:30,547 and then dot the extension that we just created, all right? 130 00:07:33,120 --> 00:07:35,410 So let's get rid of this comment, 131 00:07:35,410 --> 00:07:37,780 and so that is actually our storage. 132 00:07:37,780 --> 00:07:40,310 And so basically a complete definition 133 00:07:40,310 --> 00:07:42,540 of how we want to store our files, 134 00:07:42,540 --> 00:07:44,963 with the destination and the filename. 135 00:07:46,270 --> 00:07:48,833 Next up, let's create a Multer filter. 136 00:07:52,270 --> 00:07:53,983 So let's call it exactly that. 137 00:07:57,200 --> 00:08:00,370 And the filter in Multer is simply, again, 138 00:08:00,370 --> 00:08:04,010 a callback function, similar to the ones we had before, 139 00:08:04,010 --> 00:08:08,433 accessing the request, file, and a callback function. 140 00:08:09,850 --> 00:08:11,730 And in this function, the goal is basically 141 00:08:11,730 --> 00:08:14,660 to test if the uploaded file is an image. 142 00:08:14,660 --> 00:08:17,220 And if it is so, then we pass true 143 00:08:17,220 --> 00:08:19,010 into the callback function, 144 00:08:19,010 --> 00:08:22,110 and if it's not we pass false into the callback function, 145 00:08:22,110 --> 00:08:23,410 along with an error. 146 00:08:23,410 --> 00:08:25,810 Because again, we do not want to allow files 147 00:08:25,810 --> 00:08:28,020 to be uploaded that are not images. 148 00:08:28,020 --> 00:08:31,370 And so that's exactly what this filter is for. 149 00:08:31,370 --> 00:08:33,090 Now, if in your own application 150 00:08:33,090 --> 00:08:36,830 you want to upload something else, let's say CSV files, 151 00:08:36,830 --> 00:08:40,260 when then of course you can test for that instead of images. 152 00:08:40,260 --> 00:08:42,240 So all the stuff that we're doing here 153 00:08:42,240 --> 00:08:43,960 works not only for images, 154 00:08:43,960 --> 00:08:45,790 but really for all kinds of files 155 00:08:45,790 --> 00:08:48,090 that you want to upload, all right? 156 00:08:48,090 --> 00:08:51,610 Now again, in this case we are really talking about images, 157 00:08:51,610 --> 00:08:54,640 and so let's test if the uploaded file is an image. 158 00:08:54,640 --> 00:08:58,410 And for that we will once more use the mimetype, 159 00:08:58,410 --> 00:09:00,770 because whatever image type is uploaded, 160 00:09:00,770 --> 00:09:05,300 so no matter if it's a JPEG, or a PNG, or a bitmap, 161 00:09:05,300 --> 00:09:07,730 or a TIFF, or really anything, 162 00:09:07,730 --> 00:09:10,950 the mimetype will always start with image. 163 00:09:10,950 --> 00:09:13,170 And so now we can test for that. 164 00:09:13,170 --> 00:09:17,643 So if file.mimetype.startsWith, 165 00:09:21,890 --> 00:09:25,910 image, and so I'm not sure if we have used this one before, 166 00:09:25,910 --> 00:09:29,700 but it is a fairly new and very useful string method 167 00:09:29,700 --> 00:09:31,750 that is available in JavaScript, 168 00:09:31,750 --> 00:09:33,593 so in all JavaScript in general. 169 00:09:34,770 --> 00:09:38,650 So in case that we actually have an image, well, 170 00:09:38,650 --> 00:09:42,090 then again there is no error and we pass true, 171 00:09:42,090 --> 00:09:43,810 as I said in the beginning. 172 00:09:43,810 --> 00:09:48,810 But otherwise, we will then actually pass an error, 173 00:09:50,520 --> 00:09:52,080 and then false. 174 00:09:52,080 --> 00:09:55,320 So let's just put an x here, and false. 175 00:09:55,320 --> 00:09:58,910 So for this x here, we will now create an AppError, 176 00:09:58,910 --> 00:10:01,010 just like we've been doing all along. 177 00:10:01,010 --> 00:10:03,423 And actually we already have that here. 178 00:10:04,470 --> 00:10:07,643 So let's say new AppError, 179 00:10:10,522 --> 00:10:14,896 not an image, 180 00:10:14,896 --> 00:10:19,896 please upload only images, all right? 181 00:10:20,709 --> 00:10:23,459 And then a 400 for a bad request. 182 00:10:24,876 --> 00:10:28,875 Great, so we have our storage, we have our filter, 183 00:10:28,875 --> 00:10:30,567 now it's time to actually use them 184 00:10:30,567 --> 00:10:33,294 in order to create the upload. 185 00:10:33,294 --> 00:10:37,228 All right, so the upload will now not look like this, 186 00:10:37,228 --> 00:10:40,816 but instead we will pass in these variables. 187 00:10:40,816 --> 00:10:44,149 So in Multer we can specify the storage, 188 00:10:46,618 --> 00:10:49,368 and so that is our multerStorage. 189 00:10:52,118 --> 00:10:54,118 And then the fileFilter, 190 00:10:57,109 --> 00:11:01,276 which is the variable that we called multerFilter. 191 00:11:02,439 --> 00:11:04,299 Okay, and that's it. 192 00:11:04,299 --> 00:11:06,486 And of course we could've put all of this here 193 00:11:06,486 --> 00:11:10,225 directly into this options object here. 194 00:11:10,225 --> 00:11:12,901 But I usually prefer to do these outside 195 00:11:12,901 --> 00:11:17,076 and then simply pass the variables into an options object. 196 00:11:17,076 --> 00:11:19,351 So that then looks a bit cleaner. 197 00:11:19,351 --> 00:11:22,241 So this is a lot of steps that we need to take 198 00:11:22,241 --> 00:11:26,046 in order to really create our Multer middleware. 199 00:11:26,046 --> 00:11:27,953 But finally we then of course, 200 00:11:27,953 --> 00:11:29,770 just like we did in the last video, 201 00:11:29,770 --> 00:11:33,169 use this upload, and on that we call single, 202 00:11:33,169 --> 00:11:35,437 with the name of the field. 203 00:11:35,437 --> 00:11:38,688 So photo, and then from there we create an export, 204 00:11:38,688 --> 00:11:41,262 or middleware, which we actually already included 205 00:11:41,262 --> 00:11:42,880 into our router. 206 00:11:42,880 --> 00:11:46,845 So let's now delete this old kind of image 207 00:11:46,845 --> 00:11:48,845 that we had here before. 208 00:11:50,649 --> 00:11:52,399 No, that didn't work. 209 00:11:54,543 --> 00:11:57,569 And now let's actually test it here again. 210 00:11:57,569 --> 00:12:00,637 So back in Postman, we still have our name here 211 00:12:00,637 --> 00:12:03,554 and the Leo image, and so let's go. 212 00:12:05,556 --> 00:12:08,473 And we got no error, which is good. 213 00:12:10,516 --> 00:12:13,516 And let's see our output here again. 214 00:12:16,428 --> 00:12:19,240 So everything here in the beginning is the same, 215 00:12:19,240 --> 00:12:23,827 but then you see that our filename is actually now correct. 216 00:12:23,827 --> 00:12:26,465 And if you take a look here at our folder, 217 00:12:26,465 --> 00:12:28,948 then indeed there is our image. 218 00:12:28,948 --> 00:12:31,934 And so that's exactly the one that we uploaded. 219 00:12:31,934 --> 00:12:34,934 So that is in dev-data, images, Leo. 220 00:12:37,649 --> 00:12:41,288 And indeed, that is exactly the same. 221 00:12:41,288 --> 00:12:43,724 Great, that's awesome. 222 00:12:43,724 --> 00:12:46,615 Now just to test this filter here as well, 223 00:12:46,615 --> 00:12:51,615 let's try to upload some other file that is not an image. 224 00:12:51,974 --> 00:12:56,516 So let's select something else here from our dev-data, 225 00:12:56,516 --> 00:13:00,278 and let's say simply some JSON data. 226 00:13:00,278 --> 00:13:04,336 And so let's wait if we get an error here. 227 00:13:04,336 --> 00:13:06,190 And indeed we get one. 228 00:13:06,190 --> 00:13:09,070 So not an image, please upload only images. 229 00:13:09,070 --> 00:13:11,643 And so it means that that also works. 230 00:13:12,610 --> 00:13:16,200 So perfect, all of our Multer configuration 231 00:13:16,200 --> 00:13:18,540 now works really fine, but of course 232 00:13:18,540 --> 00:13:20,480 there's still one step missing. 233 00:13:20,480 --> 00:13:22,660 And that is to actually link the user 234 00:13:22,660 --> 00:13:25,550 to the newly-updated image, right? 235 00:13:25,550 --> 00:13:27,660 Because right now in the database, 236 00:13:27,660 --> 00:13:29,420 we obviously still have the path, 237 00:13:29,420 --> 00:13:31,840 or actually the name of the old image, 238 00:13:31,840 --> 00:13:34,460 because nowhere in our code we specified 239 00:13:34,460 --> 00:13:38,180 that we wanted to update the user document itself, right? 240 00:13:38,180 --> 00:13:40,603 And so let's fix that in the next video. 19101

Can't find what you're looking for?
Get subtitles in any language from opensubtitles.com, and translate them here.