Tworzę funkcję przesyłania plików w node.js z express 3.
Chciałbym pobrać rozszerzenie pliku obrazu. więc mogę zmienić nazwę pliku, a następnie dołączyć do niego rozszerzenie pliku.
app.post('/upload', function(req, res, next) {
var is = fs.createReadStream(req.files.upload.path),
fileExt = '', // I want to get the extension of the image here
os = fs.createWriteStream('public/images/users/' + req.session.adress + '.' + fileExt);
});
Jak mogę uzyskać rozszerzenie obrazu w node.js?
javascript
node.js
file-type
georgesamper
źródło
źródło
Odpowiedzi:
Uważam, że możesz wykonać następujące czynności, aby uzyskać rozszerzenie nazwy pliku.
źródło
app.css.gz
wrócą tylko.gz
i nie.css.gz
, co może lub nie być tym, czego chcesz.filename.split('.').pop();
.
.'filename.css.gz'.split('.').slice(1).join('.')
się uzyskać wszystkie rozszerzeniajone.lastTest.654654556.tar.gz
tutaj, oczekiwanym rozszerzeniem jest tar.gz, ale jeśli zastosujesz dowolną funkcję, która daje formę 1. kropki, to nie będzie działać, jak widaćAktualizacja
Ponieważ oryginalna odpowiedź, extname () została dodana do
path
modułu, patrz odpowiedź SnowfishOryginalna odpowiedź:
Korzystam z tej funkcji, aby uzyskać rozszerzenie pliku, ponieważ nie znalazłem sposobu na zrobienie tego w łatwiejszy sposób (ale myślę, że jest):
aby go użyć, musisz wymagać „ścieżki”.
inna metoda, która nie korzysta z modułu ścieżki:
źródło
var is = fs.createReadStream(req.files.upload.path), fileType = is.path.split(/[. ]+/).pop();
Jeśli używasz ekspresowego, dodaj następujący wiersz podczas konfigurowania oprogramowania pośredniego (bodyParser)
źródło
O wiele bardziej wydajne jest użycie tej
substr()
metody zamiastsplit()
&pop()
Spójrz na różnice w wydajności tutaj: http://jsperf.com/remove-first-character-from-string
Aktualizacja sierpień 2019 r. Jak wskazał @xentek w komentarzach;
substr()
jest teraz uważany za funkcję starszą ( dokumentacja MDN ). Zamiast tego możesz użyćsubstring()
. Różnica międzysubstr()
isubstring()
polega na tym, że drugi argumentsubstr()
to maksymalna długość do zwrócenia, podczas gdy drugi argumentsubstring()
to indeks, na którym należy się zatrzymać (bez uwzględnienia tego znaku). Równieżsubstr()
akceptuje negatywne pozycje zaczynają być wykorzystywane jako przesunięcie od końca łańcucha natomiastsubstring()
nie.źródło
substr
ponieważ jest uważane za starszą funkcję i należy jej unikać, gdy jest to możliwe - Więcej informacji na temat MDNTo rozwiązanie obsługuje kwerendy!
źródło
Proste rozwiązanie bez potrzeby, które rozwiązuje problem przedłużenia okresu:
Lub jeśli nie chcesz początkowej kropki:
Sprawdź, czy plik ma również rozszerzenie.
źródło
Myślę, że mapowanie nagłówka Content-Type w żądaniu również będzie działać. Działa to nawet w przypadku przesyłania pliku bez rozszerzenia. (gdy nazwa pliku nie ma rozszerzenia w żądaniu)
Załóżmy, że wysyłasz dane za pomocą HTTP POST:
Tutaj nazwa Nagłówek Content-Type zawiera typ MIME danych. Mapowanie tego typu MIME na rozszerzenie da ci rozszerzenie pliku :).
Restify BodyParser konwertuje ten nagłówek na właściwość o typie nazwy
Możesz użyć tego nagłówka i ręcznie wykonać mapowanie rozszerzeń (podłańcuch itp.), Ale istnieją też gotowe biblioteki. Poniżej dwa były najlepsze wyniki, gdy wyszukiwałem w Google
a ich użycie jest również proste:
powyżej fragmentu wypisze png na konsolę.
źródło
źródło
path.extname
zrobi lewę w większości przypadków. Będzie jednak zawierał wszystko po ostatnim.
, w tym ciąg zapytania i fragment skrótu żądania http:W takich przypadkach możesz spróbować czegoś takiego:
Pamiętaj, że rozszerzenia z wieloma kropkami (np.
.tar.gz
) W ogóle nie będą działaćpath.extname
.źródło
Poniższa funkcja dzieli ciąg i zwraca nazwę i rozszerzenie bez względu na liczbę kropek w rozszerzeniu. Zwraca pusty ciąg dla rozszerzenia, jeśli go nie ma. Nazwy zaczynające się od kropek i / lub białych znaków działają również.
źródło
import extname, aby zwrócić rozszerzenie plik:
gdzie plik to „nazwa” formy
źródło
Możesz na przykład użyć path.parse (ścieżka)
źródło
Spróbuj tego
źródło