2010-04-30 1 views
4

Я могу успешно создать файл CSV путем выдачи формы HTML POST в новом окне и использовать PHP ответить:XMLHttpRequest() и вывода файла CSV

header('Content-type: text/csv'); 
header('Content-Disposition: attachment; filename="'.date("Ymdhis").'.csv"'); 
print get_lines(); 

Однако, это оставляет окно открытым и пустой.

Я хочу либо закрыть окно автоматически (при распознавании Content-Disposition), либо я бы предпочел полностью игнорировать окно и просто onClick, вызвать XMLHttpRequest() отправить переменные формы в PHP, сгенерировать файл данных а затем предложите пользователю сохранить или открыть.

Я попытался:

var xhReq = new XMLHttpRequest(); 
var parameters = ""; 

for (i=0; i<formObj.elements.length; i++) { 
    parameters += formObj.elements[i].name + "=" + encodeURI(formObj.elements[i].value) + "&"; 
} 

xhReq.open("POST", outputLocation, false); 
xhReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
xhReq.setRequestHeader("Content-length", parameters.length); 
xhReq.setRequestHeader("Connection", "close"); 
xhReq.send(parameters); 

document.write(xhReq.responseText); 

, но это не работает, потому что ответ просто печатается в виде текста на экране.

Что я действительно хочу, это когда у меня есть все данные, чтобы выпустить новый вызов header() без открытия нового окна - возможно ли это с помощью javascript?

ответ

3

Для того, чтобы сделать это, необходимо послать запрос POST. Я хотел бы предложить вам создать скрытый вид и установить его target атрибут _blank

Вы должны установить заголовок в Content-disposition HTTP на стороне сервера, чтобы заставить скачать.

Вы вызываете document.write, который выгружает текстовую строку в браузер, это скорее всего не то, что вы хотите сделать.

+0

+1 - просто повторить - использование XMLHttpRequest в этом случае не указывается. Простое скрытое или динамически созданное представление формы для «_blank» подходит –

+0

похоже, что вы уже используете форму - вам, вероятно, не нужно создавать новую скрытую форму, просто добавьте target = "_ blank" в вашу текущую форму и канаву javascript/XHR. также обязательно включите соответствующие заголовки, если вы хотите, чтобы файл инициировал загрузку. в PHP: заголовок («Content-Disposition: attachment; filename = someFileName.csv»); – Keith

+0

Я уже использую новое окно - я стараюсь избегать этого, так как это действительно не требуется ... Возможно, вопрос должен быть слегка перефразирован. Как я могу это сделать, и окно автоматически закрывается, когда оно осознает, что оно имеет Content-Disposition: attachment; имя файла = file.csv; – sjw