Избягване на обратна наклонена черта в низ - javascript

Трябва да покажа името на текущо избрания файл (в <input type="file"> елемент).

Всичко е наред, единственият проблем е, че получавам този вид низ "C:\fakepath \typog_rules.pdf" (браузет автоматично поставя това като стойност за входния елемент).

Когато се опитам да разделя низа с '\' или '\\', това се проваля поради неекранирани наклонени черти. Опитите за съвпадение/замяна на наклонени черти също са неуспешни. Има ли начин да се заобиколи това? Трябва ми това да работи поне в Opera и IE (тъй като в други браузъри мога да използвам FileReader)

напр. Получавам "C:\fakepath\typog_rules.pdf" като вход и искам да получа "typog_rules.pdf" като изход.


person Max    schedule 23.12.2011    source източник
comment
Можете ли да ни покажете кода и грешката, която получавате?   -  person ean5533    schedule 23.12.2011
comment
Това отговаря ли на въпроса ви? Обратно наклонената черта на JavaScript (\‌) в променливите причинява грешка   -  person Liam    schedule 27.07.2020


Отговори (5)


От съображения за сигурност не е възможно да се получи истинският пълен път на файл, препратен чрез елемент <input type="file" />.

Този въпрос вече споменава и връзки към други въпроси за Stack Overflow относно тази тема.


Предишен отговор, запазен като справка за бъдещи посетители, които достигат до тази страница чрез заглавие, тагове и въпрос.
Обратната наклонена черта трябва да бъде екранирана .

string = string.split("\\");

В JavaScript обратната наклонена черта се използва за екраниране на специални знаци, като нови редове (\n). Ако искате да използвате буквална обратна наклонена черта, трябва да използвате двойна обратна наклонена черта.

Така че, ако искате да съпоставите две обратни наклонени черти, трябва да използвате четири обратни наклонени черти. Например alert("\\\\") ще покаже диалогов прозорец, съдържащ две обратни наклонени черти.

person Rob W    schedule 23.12.2011
comment
Не е полезно. Не можете да контролирате какво ви дава браузърът като входна [файл] стойност. C:\fakepath \typog_rules.pdf.split(\\); =› [C:akepath ypog_rules.pdf] - person Max; 23.12.2011
comment
@user1113690 Какво искаш? Разделяне на "C:\\fake\\path\\file" на ["C:", "fake", "path", "file"]? Трябва да изясните въпроса си и да добавите текущия изход, реалния вход, очаквания изход и съответния код. - person Rob W; 23.12.2011
comment
Получавам C:\fakepath\typog_rules.pdf като вход и искам да получа typog_rules.pdf като изход. - person Max; 23.12.2011
comment
Аха - това е очаквано поведение. Ясно е, че от съображения за сигурност не е желателно част от JavaScript да може да получи пълния път на файл. За да обобщим, не е възможно да получите пълния път на файл в елемент <input type=file>. - person Rob W; 24.12.2011
comment
За съжаление, както изглежда, това е приложимо само за Opera. IE може да раздели низа C:\fakepath \typog_rules.pdf.split(\\); както се предполага. Благодаря за отделеното време! - person Max; 24.12.2011
comment
@user1113690 Защото IE показва пълния път. Вашият проблем няма нищо общо с операции с низове, а с получаване на стойността на поле за въвеждане на файл. Ако този отговор Ви удовлетворява, маркирайте въпроса като Приет, като щракнете върху зелената отметка от лявата страна на отговора. - person Rob W; 24.12.2011
comment
Някакво решение за това? Получаване на C:\fakepath \typog_rules.pdf.split(\\); =› [C:akepath ypog_rules.pdf] в MAC Chrome - person Pankaj Phartiyal; 04.04.2013
comment
@PankajPhartiyal Избягахте ли от обратната наклонена черта в оригиналния низов литерал? Ако изглежда, че сте използвали една обратна наклонена черта, която избягва следните знаци: \f (формуляр емисия), \t (табулация). Използвайте "C:\\fakepath\\typog_rules.pdf".split("\\"); вместо това. Необходими са две обратни наклонени черти, за да видите обратна наклонена черта в низ. - person Rob W; 04.04.2013
comment
И как мога да направя това в Javascript. Имам предвид как мога да конвертирам единична обратна наклонена черта в двойна. Защото бягството не може да бъде избегнато в такива низове. replace, split и други функции за манипулиране на низове не могат да открият /, тъй като низът им се предава в екранирана форма. напр. "C:\fakepath\alex-dukal_stamp-brushes_v2.abr".lastIndexOf('\\') връща -1 - person Pankaj Phartiyal; 04.04.2013
comment
@PankajPhartiyal Както казах в предишния си коментар, \f е екраниран знак за форма за емисии. Това не е обратна наклонена черта, последвана от f. Ако искате да поставите обратна наклонена черта в низ, екранирайте я: `\`. Не е нужно да се притеснявате за бягствата, ако ги разбирате. Само не забравяйте да избегнете обратната наклонена черта, когато възнамерявате да се обърнете към обратна наклонена черта в изходния код. Когато получите информация от напр. потребителят, обратните наклонени черти нямат това специално значение. - person Rob W; 04.04.2013
comment
$("[type=file]").val() връща "C:\fakepath\alex-dukal_stamp-brushes_v2.abr", но когато напиша "C:\fakepath\alex-dukal_stamp-brushes_v2.abr", тогава се връща екранирана версия "C:akepathalex-dukal_stamp-brushes_v2.abr". Означава, че $("[type=file]").val() връща двоен екраниран низ, който запазва наклонени черти. Играех си с необработен низ в chrome конзолата и всичко се обърка. Благодаря, човече. - person Pankaj Phartiyal; 04.04.2013
comment
@Pankaj: и все още го разбирате погрешно, представянето на низовете в паметта никога не се избягва. Бягството е въпрос на сериализация. .val() връща неекранирани низове. Това, което не е правилно, е, че при отпечатване, отпечатаната стойност на низ може да не се върне, тъй като низовите литерали изискват екраниране. - person Lie Ryan; 30.05.2013

Мисля, че това е по-близо до отговора, който търсите:

<input type="file">

$file = $(file);
var filename = fileElement[0].files[0].name;
person Himerzi    schedule 18.01.2013
comment
Ако имам низ като този FILEUPLOADS\city_sri\src\com\travelocityapp22\commonmodule\dto тогава как да ги разделя с помощта на '\' - person rolling stone; 26.05.2015

Избягайте от обратната наклонена черта.

foo.split('\\')
person Quentin    schedule 23.12.2011
comment
Ами сега, не съм сигурен дали това е проблемът. Изглежда, че OP вече е опитал това (разглеждах източника на въпроса — и го редактирах, за да го покажа ясно) - person sidyll; 23.12.2011

Малко хакерско, но работи:

const input = '\text';
const output = JSON.stringify(input).replace(/((^")|("$))/g, "").trim();

console.log({ input, output });
// { input: '\text', output: '\\text' }

person Ashley Williams    schedule 02.07.2018

Добавете входен идентификатор към елемента и направете нещо подобно:

document.getElementById('inputId').value.split(/[\\$]/).pop()
person Yifat Biezuner    schedule 22.06.2016