Форум программистов, компьютерный форум, киберфорум
jQuery
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
1 / 1 / 0
Регистрация: 31.03.2017
Сообщений: 47

Сохранение файла в cp1251

26.04.2017, 16:37. Показов 5849. Ответов 17
Метки java (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть запрос на ajax который получает в качестве ответа от сервера файл pdf его необходимо сохранить. Сделал сохранение следующим образом.
JavaScript
1
2
3
4
5
var blob=new Blob([response]);
var link=document.createElement('a');
link.href=window.URL.createObjectURL(blob);
link.download="myFileName.pdf";
link.click();
Все замечательно работает, только файл сохраняется в кодировке UTF8, а надо в Windows 1251. В отладчике строка response приходит правильной, но в
Java
1
var blob=new Blob([response])
blob становится уже в два раза больше чем надо. Как мне получить нужную кодировку? Пробовал применять response.getBytes("Cp1251") но это почему то не сработало. Так тоже не получилось
Java
1
byte[] winData = response.getBytes("Cp1251")
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.04.2017, 16:37
Ответы с готовыми решениями:

Считывание файла CP1251
Есть файл в кодировке CP1251, который считывается построчно. В процессе перегоняю его в формат UTF-8 посредством "iconv". Файл...

Почему не выводит текст из файла (CP1251)?
Почему не выводит текст из файла (CP1251)? #include <iostream> #include <fstream> #include <string> #include <locale> ...

Почему не выводит текст из файла (CP1251)?
#include <iostream> #include <fstream> #include <string> #include <locale> using namespace std; int main() { ...

17
 Аватар для Уф
890 / 725 / 447
Регистрация: 13.07.2015
Сообщений: 2,277
26.04.2017, 16:49
Смени кодировку самой страницы на 1251
или
Вместо аякса отправляй обычную форму прямо в этом окне, файл кинется на загрузку, а страница не пропадет
0
1 / 1 / 0
Регистрация: 31.03.2017
Сообщений: 47
26.04.2017, 17:14  [ТС]
Цитата Сообщение от Уф Посмотреть сообщение
Смени кодировку самой страницы на 1251
Это не вариант.
Цитата Сообщение от Уф Посмотреть сообщение
Вместо аякса отправляй обычную форму прямо в этом окне, файл кинется на загрузку, а страница не пропадет
А это как? Не совсем понял.

Добавлено через 7 минут
А нельзя как то изменить кодировку blob? Или кодировку при скачивании link.download?
0
 Аватар для Уф
890 / 725 / 447
Регистрация: 13.07.2015
Сообщений: 2,277
26.04.2017, 17:16
вот этой функцие попробуй
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function postToUrl(path, params, method) {
    method = method || "post"; // Устанавливаем метод отправки.
    var form = document.createElement("form");
    form.setAttribute("method", method);
    form.setAttribute("action", path);
    form.setAttribute("target", "_blank");
    for(var key in params) {
        var hiddenField = document.createElement("input");
        hiddenField.setAttribute("type", "hidden");
        hiddenField.setAttribute("name", key);
        hiddenField.setAttribute("value", params[key]);
        form.appendChild(hiddenField);
    }
    form.submit();
}
только на выдаче файла заголовки тоже надо отправить сперва Скачивание файла из БД PostgreSQL
0
1 / 1 / 0
Регистрация: 31.03.2017
Сообщений: 47
26.04.2017, 17:25  [ТС]
У меня открывается новое окно, а так как помимо post запроса у меня еще есть параметры в ссылке типа "/cgi-bin/account.pl?ID=ATsTzzrNf0G" то сервер ничего не выдает. Как передать параметры и в ссылке тоже? И почему открывается еще одно окно? Или я чего то недопонял?
0
 Аватар для Уф
890 / 725 / 447
Регистрация: 13.07.2015
Сообщений: 2,277
26.04.2017, 17:35
чтобы новое не открвалось убери 6 строку из моей функции ( где таргет бланк ) а параметры передай в функцию объектом
JavaScript
1
postToUrl('page.php', {ID:'ATsTzzrNf0G'});
0
1 / 1 / 0
Регистрация: 31.03.2017
Сообщений: 47
26.04.2017, 17:40  [ТС]
Как передать данные для post запроса? В Ajax я просто делал data: paramsPOST, , а здесь он пытается разобрать мою строку с параметрами на ключи, но делать этого не надо. Нужно просто отправить эту строку.
0
 Аватар для Уф
890 / 725 / 447
Регистрация: 13.07.2015
Сообщений: 2,277
26.04.2017, 17:55
Лучший ответ Сообщение было отмечено zhukovia как решение

Решение

он создает текстовые поля в форме и туда эти значения записывает. твоя функция аджакс тоже самое делает

Добавлено через 41 секунду
если длинная строка можно накостылить чтобы она разбилась по полям, а не объект

Добавлено через 4 минуты
както так
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
postToUrl('page.php','?ID=ATsTzzrNf0G'});
 
function postToUrl(path, params, method) {
    method = method || "post"; // Устанавливаем метод отправки.
    var form = document.createElement("form");
    form.setAttribute("method", method);
    form.setAttribute("action", path);
    var pars = params.substr(1).split('&');
    for(var key = 0; key < pars.length; key++) {
        var el = pars[key].split('=');
        var hiddenField = document.createElement("input");
        hiddenField.setAttribute("name", el[0]);
        hiddenField.setAttribute("value", el[1]);
        form.appendChild(hiddenField);
    }
    form.submit();
}
Добавлено через 3 минуты
или регуляркой
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
postToUrl('page.php','?ID=ATsTzzrNf0G'});
 
function postToUrl(path, params, method) {
    method = method || "post"; // Устанавливаем метод отправки.
    var form = document.createElement("form");
    form.setAttribute("method", method);
    form.setAttribute("action", path);
    form.setAttribute("target", "_blank");
    params = GetP(params);
    for(var key in params) {
        var hiddenField = document.createElement("input");
        hiddenField.setAttribute("type", "hidden");
        hiddenField.setAttribute("name", key);
        hiddenField.setAttribute("value", params[key]);
        form.appendChild(hiddenField);
    }
    form.submit();
}
 
var GetP = function (strQuery) { //получает параметры гет из строчки
    var strSearch   = strQuery.substr(1),
        strPattern  = /([^=]+)=([^&]+)&?/ig,
        arrMatch    = strPattern.exec(strSearch),
        objRes      = {};
    while (arrMatch != null) {
        objRes[arrMatch[1]] = arrMatch[2];
        arrMatch = strPattern.exec(strSearch);
    }
    return objRes;
};
Добавлено через 5 минут
и еще идея. раз у тебя в отлачике приходит уже формат блоб, может тебе и не надо еще раз его делать? попробуй так
JavaScript
1
2
3
4
var link=document.createElement('a');
link.href=window.URL.createObjectURL(response);
link.download="myFileName.pdf";
link.click();
1
1 / 1 / 0
Регистрация: 31.03.2017
Сообщений: 47
26.04.2017, 19:22  [ТС]
Шестую строчку убрал, теперь новое окно не открывается, но на старом все стирается и высвечивается ответ от сервера.
Данные все равно не понимаю как передать. У меня строка вида
JSON
1
&analiz_bar=203&analiz_auc=203&DivSort={"color_auc":["all","2","3","4","5","6","7","8","9"],"size_auc":["all","XXI%20%20%20%
И она никак не передается. Я так понимаю вместо = должно быть :, но мне переделывать всю логику скрипта будет проблематично. Этот запрос отправляется при разных нажатиях разных кнопок и строку с параметрами переделывать сложно очень. Неужели нельзя как то проще сохранить файл в существующем Ajax запросе?

Добавлено через 5 минут
Цитата Сообщение от Уф Посмотреть сообщение
и еще идея. раз у тебя в отлачике приходит уже формат блоб, может тебе и не надо еще раз его делать? попробуй так
Попробовал выдало ошибку.
JavaScript
1
Uncaught TypeError: Failed to execute 'createObjectURL' on 'URL': No function was found that matched the signature provided.
И у меня вроде приходит строка с pdf файлом.

Добавлено через 11 минут
ОГРОМНОЕ Вам Спасибо!!! Заработало!!!
Хотя и похоже на костыль, но я уже так задолбался что оставлю так как есть. Не понятно только почему из ajax не работает.

Добавлено через 1 час 5 минут
А еще подскажите, пожалуйста. А где ждать ответа на запрос?
0
 Аватар для Уф
890 / 725 / 447
Регистрация: 13.07.2015
Сообщений: 2,277
26.04.2017, 19:29
заработало в каком варианте? а то мне самому интересно

Добавлено через 5 минут
у меня ответ валится сразу на вкладку загрузки браузера. у вас сам скрипт выдачи на пхп? как он файл отдает можно увидеть?
1
1 / 1 / 0
Регистрация: 31.03.2017
Сообщений: 47
26.04.2017, 20:05  [ТС]
У меня скрипт выдачи на perl, а он в свою очередь запрашивает у 1С. На перле все просто получаем ответ от сервера ставим заголовки и print. Возможно часть заголовков здесь и лишняя но уберу потом методом проб и ошибок. И пока еще не понятно как передать с сервера 1С имя файла, думаю в заголовках переслать но чего то пока не выходит.
Perl
1
2
3
4
5
6
7
8
9
10
11
$file = $response->content;
print "Content-Description: File Transfer\n";
print "Content-Type: application/octet-stream; charset=windows-1251\n";                 
print "Content-Disposition: attachment; filename=filename.txt\n";
#print "Content-Disposition: attachment; filename=".$filename."\n";
print "Content-Transfer-Encoding: binary\n";
print "Expires: 0\n";
print "Cache-Control: must-revalidate\n";
print "Pragma: public\n";
print "Content-Length: ".length($file)."\n\n";
print Dumper $file;
А на JS вот так
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
paramsPOST = paramsPOST + '&print=pdf';
var form = document.createElement("form");
form.setAttribute("method", "post");
form.setAttribute("action", url+"?ID="+params['ID']);
//form.setAttribute("target", "_blank");
var pars = paramsPOST.substr(0).split('&');
for(var key = 0; key < pars.length; key++) {
    var el = pars[key].split('=');
    var hiddenField = document.createElement("input");
    hiddenField.setAttribute("name", el[0]);
    hiddenField.setAttribute("value", el[1]);
    form.appendChild(hiddenField);
}
form.submit();
Только вот еще надо научится отлавливать приход ответа от сервера, т.к. мне нужно во время ожидания крутить колесико (ждет долго), а потом его нужно останавливать.
0
 Аватар для Уф
890 / 725 / 447
Регистрация: 13.07.2015
Сообщений: 2,277
26.04.2017, 20:23
ты $response с помощью HTTP message получаешь, там же и заголовки можно вписать и кодировку http://search.cpan.org/~ether/... Message.pm вот тут прочти, может тогда старым твоим методом нормально будет скачиваться по ajax
1
1 / 1 / 0
Регистрация: 31.03.2017
Сообщений: 47
26.04.2017, 20:52  [ТС]
Цитата Сообщение от Уф Посмотреть сообщение
ты $response с помощью HTTP message получаешь, там же и заголовки можно вписать и кодировку http://search.cpan.org/~ether/... Message.pm вот тут прочти, может тогда старым твоим методом нормально будет скачиваться по ajax
Я с помощью LWP получаю и получаю то я в правильной кодировке и даже в JS приходило в нормальной, а вот в файл записывалось в UTF8. Может я конечно где то ступил но уже после недели лазанья ничего не хочется переделывать раз все работает. Заголовки я правильные пихал с кодировками но один хрен что то не сросталось. Теперь и имя файла из 1С смог передать, в заголовках. Просто песня.... Еще раз Спасибо!

Добавлено через 14 минут
А все же. Где отлавливать то что ответ от сервера пришел?
0
 Аватар для Уф
890 / 725 / 447
Регистрация: 13.07.2015
Сообщений: 2,277
26.04.2017, 22:57
я понял, ты хочешь узнать как понять выдался файл или нет? не знаю.
может в функции постав в свойвствах form будет что-нибудь меняться

Добавлено через 7 минут
тебе тогда наверное в функци вся требуха с разбором строк не нужна раз ты в урл подставляешь, хотя я всегда думал что в урл только гет запрос будет работать, попробуй всю строку туда свою впихнуть. может покатит и функция сократится. а то если вдруг знак & или = встретится в твоей json строке DivSort все в кашу неправильно разобьется
1
1 / 1 / 0
Регистрация: 31.03.2017
Сообщений: 47
26.04.2017, 23:24  [ТС]
А что в form есть какое то свойство при возврате ответа от сервера?
Цитата Сообщение от Уф Посмотреть сообщение
тебе тогда наверное в функци вся требуха с разбором строк не нужна раз ты в урл подставляешь, хотя я всегда думал что в урл только гет запрос будет работать, попробуй всю строку туда свою впихнуть. может покатит и функция сократится. а то если вдруг знак & или = встретится в твоей json строке DivSort все в кашу неправильно разобьется
А у меня и в URL и в post пихаются параметры. В URL только ID для контроля сессии, а в post ID и все прочее. Не знаю может и неоптимально но как то так сразу сделал, а сейчас переделывать лень.
0
 Аватар для Уф
890 / 725 / 447
Регистрация: 13.07.2015
Сообщений: 2,277
27.04.2017, 07:20
еще можно попробовать в base64 файл выдать, а потом его обратно собрать, тогда кодировка не слетит http://stackoverflow.com/quest... javascript (но это не точно)
0
1 / 1 / 0
Регистрация: 31.03.2017
Сообщений: 47
27.04.2017, 09:19  [ТС]
Цитата Сообщение от Уф Посмотреть сообщение
еще можно попробовать в base64 файл выдать, а потом его обратно собрать
Это я пробовал делать. Но то ли раскодировка/кодировка в perle и JS отличается, то ли у меня руки не из того места растут но у меня не получилось.
0
1 / 1 / 0
Регистрация: 31.03.2017
Сообщений: 47
03.05.2017, 16:32  [ТС]
Сделал все с помощью XMLHttpRequest (почти AJAX).
Инициализация XMLHttpRequest.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function getXmlHttp(){
  var xmlhttp;
  try {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
    try {
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (E) {
      xmlhttp = false;
    }
  }
  if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
    xmlhttp = new XMLHttpRequest();
  }
  return xmlhttp;
}
А это сама отправка.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var xmlhttp = getXmlHttp();
xmlhttp.open('POST', url+"?ID="+params['ID'], true);
xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xmlhttp.responseType='blob';
xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4) {
        if(xmlhttp.status == 200) {
            var link=document.createElement('a');
            link.href=window.URL.createObjectURL(xmlhttp.response);
            link.download=decodeURIComponent(xmlhttp.getResponseHeader("FileName"));
            link.click();
        }
    }
};
xmlhttp.send(paramsPOST);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.05.2017, 16:32
Помогаю со студенческими работами здесь

Перекодировка DBF файла из cp1251 в UTF-8
Есть dbf файл (база БИК), он сохранен в cp1251, как данные из него перекодировать в UTF-8? сам файл базы бик:...

Загрузка в Memo текста из файла в кодировке Win (cp1251)
Решение нашел - но не уверен, что оно лучшее. В исходном тексте (ниже) закомментированные варианты не сработали procedure...

Написать программу конвертер текстовых файлов с одной кодировки в другую из файла (CP1251, UTF8, KOIR8)
Написать программу конвертер текстовых файлов с одной кодировки в другую из файла (текст кириллица. Помогите написать:)

При сохранение файла word (права доступа на сохранение ограничены) появляется пустой файл
Добрый день! Проблема такая: Допустим есть пользователь, у которого ограничены права (может просматривать документ, но удалять и...

Написать текстовый редактор, в котором продемонстрировать открытие файла, сохранение файла, создание нового файла
№ 5. Написать текстовый редактор, в котором продемонстрировать открытие файла, сохранение файла, создание нового файла – чистого листа, на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru