J'essaie de poster une grande vidéo (près de 1 Go). P>
J'utilise FTP pour envoyer une vidéo sur un serveur, mais le téléchargement cesse après un moment. Sur le serveur, la vidéo se bloque, mais je suis capable de télécharger une vidéo de taille plus petite. P>
J'ai également utilisé HTTP pour envoyer une vidéo sur le serveur, envoyé sous forme de chaîne en bourse6444, mais il y a une exception J'ai essayé de télécharger la vidéo en tant que fichier, mais sans succès. Quelle est la meilleure façon de télécharger une grande vidéo sur un serveur? P>
3 Réponses :
Utilisez HTTP POST et POST Content comme Téléchargement de fichier basé sur le formulaire (type MIME: multipart / formulaire Les données). Ce système est standard sur le Web pour envoyer des formulaires et / ou télécharger des fichiers.
Utilisez le mode Post chunked HTTP, de sorte que la taille n'a pas besoin d'être connue à l'avance et vous pouvez diffuser n'importe quel fichier en petites pièces. Vous devez toujours faire du code sur le serveur (par exemple dans PHP) pour accepter le fichier et faire ce qui est nécessaire. P>
Utilisez httpurlconnection pour lancer la connexion. Ensuite, utilisez ma classe attachée pour envoyer les données. Il créera des en-têtes appropriés, etc., et vous l'utiliserez comme sortie pour écrire vos données brutes, puis appelez fermer et vous avez terminé. Vous pouvez dépasser son point de vue sur le code d'erreur résultant. P>
public class FormDataWriter extends FilterOutputStream{ private final HttpURLConnection con; /** * @param formName name of form in which data are sent * @param fileName * @param fileSize size of file, or -1 to use chunked encoding */ FormDataWriter(HttpURLConnection con, String formName, String fileName, long fileSize) throws IOException{ super(null); this.con = con; con.setDoOutput(true); String boundary = generateBoundary(); con.setRequestProperty(HTTP.CONTENT_TYPE, "multipart/form-data; charset=UTF-8; boundary="+boundary); { StringBuilder sb = new StringBuilder(); writePartHeader(boundary, formName, fileName==null ? null : "filename=\""+fileName+"\"", "application/octet-stream", sb); headerBytes = sb.toString().getBytes("UTF-8"); sb = new StringBuilder(); sb.append("\r\n"); sb.append("--"+boundary+"--\r\n"); footerBytes = sb.toString().getBytes(); } if(fileSize!=-1) { fileSize += headerBytes.length + footerBytes.length; con.setFixedLengthStreamingMode((int)fileSize); }else con.setChunkedStreamingMode(0x4000); out = con.getOutputStream(); } private byte[] headerBytes, footerBytes; private String generateBoundary() { StringBuilder sb = new StringBuilder(); Random rand = new Random(); int count = rand.nextInt(11) + 30; int N = 10+26+26; for(int i=0; i<count; i++) { int r = rand.nextInt(N); sb.append((char)(r<10 ? '0'+r : r<36 ? 'a'+r-10 : 'A'+r-36)); } return sb.toString(); } private void writePartHeader(String boundary, String name, String extraContentDispositions, String contentType, StringBuilder sb) { sb.append("--"+boundary+"\r\n"); sb.append("Content-Disposition: form-data; charset=UTF-8; name=\""+name+"\""); if(extraContentDispositions!=null) sb.append("; ").append(extraContentDispositions); sb.append("\r\n"); if(contentType!=null) sb.append("Content-Type: "+contentType+"\r\n"); sb.append("\r\n"); } @Override public void write(byte[] buffer, int offset, int length) throws IOException{ if(headerBytes!=null) { out.write(headerBytes); headerBytes = null; } out.write(buffer, offset, length); } @Override public void close() throws IOException{ flush(); if(footerBytes!=null) { out.write(footerBytes); footerBytes = null; } super.close(); int code = con.getResponseCode(); onHandleResult(code); } protected void onHandleResult(int code) throws IOException{ if(code!=200 && code!=201) throw new IOException("Upload error code: "+code); } }
Qu'est-ce que Formname? Est-ce formulaire de formulaire serveur utilisé pour créer un téléchargement XML ou JSON?
Pour PHP côté, voir PHP.net/manual/fr/Features .file-upload.post-méthody.php . Formname est le nom de la variable que vous utiliserez dans PHP en $ _files ['Nom'].
Est-il également dépendant de la taille et du temps d'exécution du serveur Max Upload?
Aidez-moi, je ne suis pas de succès pour télécharger le fichier.
Seulement par taille de fichier, ce sera possible.
$ _Files ['userfile'] ['nom'], dans ce cas qui est formulaire?
Bonjour, quelle est la taille de tampon code> dans
écrire code> fonction? Est-ce la taille du fichier (je suppose que non)? Ou devez-vous appeler à plusieurs reprises la fonction
écrire code>?
C'est comme dans les sorties de sortie, vous pouvez appeler plusieurs fois d'écrire () avec n'importe quelle taille de tampon.
Je suppose que cela a échoué à cause d'un délai d'attente de la grande taille.
depuis p>
Vidéo de petite taille téléchargée avec succès p> blockQuote>
, ma suggestion est p>
- Split un gros fichier à plusieurs petits fichiers. Li>
- Téléchargez un par un ou plusieurs ensemble en fonction de l'état du réseau. LI>
- rejoindre toutes les pièces (après toutes ces personnes téléchargées avec succès) sur Server. LI>
- En raison de la petite taille, la pièce ayant échoué sur la nouvelle version sera facile. Li> ol>
juste un Theroy. P>
ce site peut aider. p>
ajouté 08.01.2013 h3>
Il a été un Pendant que, je ne sais pas si vous avez toujours besoin de cela. Quoi qu'il en soit, j'ai écrit quelques codes simples mettant en œuvre la théorie ci-dessus, en raison d'un intérêt principalement. P>
diviser un gros fichier sur plusieurs petits fichiers. del> Lisez le grand fichier en plusieurs petites pièces. P>... try (FileOutputStream dest = new FileOutputStream(destFile, true)) { FileChannel dc = dest.getChannel();// the final big file. for (long i = 0; i < count; i++) { File partFile = new File(destFileName + "." + i);// every small parts. if (!partFile.exists()) { break; } try (FileInputStream part = new FileInputStream(partFile)) { FileChannel pc = part.getChannel(); pc.transferTo(0, pc.size(), dc);// combine. } partFile.delete(); } statusCode = OK;// set ok at last. } catch (Exception e) { log.error("combine failed.", e); }Téléchargez un par un ou plusieurs ensemble en fonction de la condition du réseau. P>
Part part = parts.take(); if (part == Part.NULL) { parts.add(Part.NULL);// notify others to stop. break; } else { uploader.upload(part); }rejoindre toutes les pièces (après toutes ces personnes téléchargées avec succès) sur le serveur. Parce que c'est via http, il peut donc être dans n'importe quelle langue, tels que Java, PHP, Python, etc. Voici un exemple Java. P>
ByteBuffer bb = ByteBuffer.allocate(partSize); int bytesRead = fc.read(bb); if (bytesRead == -1) { break; } byte[] bytes = bb.array(); parts.put(new Part(createFileName(fileName, i), bytes));
Comment la mettre en œuvre dans mon projet?
httpsurlconnection privé connect = null; p>
conn.setddOnput (vrai); p>
conn.setdooutput (vrai); p>
conn.settusecaches (faux); p>
conn.setchundedreamingmode (1024); P>