Pourquoi ne pas simplement utiliser XMLHttpRequest()
avec POST ?
function beginQuoteFileUnquoteUpload(data)
{
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://www.mysite.com/myuploadhandler.php", true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.onreadystatechange = function ()
{
if (xhr.readyState == 4 && xhr.status == 200)
alert("File uploaded!");
}
xhr.send("filedata="+encodeURIComponent(data));
}
Le gestionnaire script du serveur écrit simplement les données du fichier dans un fichier.
EDIT
Le téléchargement de fichiers est toujours un post http avec un type de contenu différent. Vous pouvez utiliser ce type de contenu et séparer votre contenu avec des frontières :
function beginQuoteFileUnquoteUpload(data)
{
// Define a boundary, I stole this from IE but you can use any string AFAIK
var boundary = "---------------------------7da24f2e50046";
var xhr = new XMLHttpRequest();
var body = '--' + boundary + '\r\n'
// Parameter name is "file" and local filename is "temp.txt"
+ 'Content-Disposition: form-data; name="file";'
+ 'filename="temp.txt"\r\n'
// Add the file's mime-type
+ 'Content-type: plain/text\r\n\r\n'
+ data + '\r\n'
+ boundary + '--';
xhr.open("POST", "http://www.mysite.com/myuploadhandler.php", true);
xhr.setRequestHeader(
"Content-type", "multipart/form-data; boundary="+boundary
);
xhr.onreadystatechange = function ()
{
if (xhr.readyState == 4 && xhr.status == 200)
alert("File uploaded!");
}
xhr.send(body);
}
Si vous souhaitez envoyer des données supplémentaires, il vous suffit de séparer chaque section par une frontière et de décrire les en-têtes content-disposition et content-type pour chaque section. Chaque en-tête est séparé par une nouvelle ligne et le corps est séparé des en-têtes par une nouvelle ligne supplémentaire. Naturellement, le téléchargement de données binaires de cette manière serait légèrement plus difficile :-)
Modification supplémentaire : j'ai oublié de mentionner que la chaîne de délimitation ne doit pas se trouver dans le "fichier" texte que vous envoyez, sinon elle sera traitée comme une délimitation.
0 votes
Cela semble être la mauvaise solution à votre problème (si vous avez le contrôle du côté serveur). Si le contenu du fichier est généré à partir d'une chaîne de caractères, pourquoi ne pas simplement POST cette chaîne et créer le fichier sur le serveur (en utilisant PHP ou autre) ? Si vous téléchargez un fichier vers une destination tierce, ignorez ce commentaire.
0 votes
@JonathanJulian, quoi qu'il en soit, ce cas d'utilisation sent le vrai hack-value -), astuce géniale !