web-dev-qa-db-fra.com

Comment puis-je envoyer un fichier sur un REST API?

J'essaie d'envoyer un fichier à un serveur via une API REST. Le fichier peut potentiellement être de n'importe quel type, mais sa taille et son type peuvent être limités aux éléments pouvant être envoyés en tant que pièces jointes à un courrier électronique.

Je pense que mon approche consistera à envoyer le fichier sous forme de flux binaire, puis à l'enregistrer dans un fichier lorsqu'il arrivera sur le serveur. Existe-t-il une méthode intégrée pour le faire dans .Net ou devrai-je transformer manuellement le contenu du fichier en flux de données et l'envoyer?

Par souci de clarté, je contrôle à la fois le code client et le code serveur, de sorte que je ne suis limité à aucune approche particulière.

5
Kevin Wells

Je vous recommande de regarder dans RestSharp
http://restsharp.org/

La bibliothèque RestSharp a des méthodes pour poster des fichiers sur un service REST. (RestRequst.AddFile()). Je crois que côté serveur, cela se traduira par une chaîne codée dans le corps, avec le type de contenu dans l'en-tête spécifiant le type de fichier. 

Je l'ai également constaté en convertissant un flux en chaîne en base 64 et en le transférant comme l'une des propriétés de l'objet json/xml sérialisé. Surtout si vous pouvez définir des limites de taille et que vous souhaitez inclure des métadonnées de fichier dans la demande dans le même objet, cela fonctionne vraiment bien.

Cela dépend vraiment de la taille de vos fichiers. Si elles sont très volumineuses, vous devez envisager la diffusion en continu, dont les nuances sont décrites en détail dans ce SO article: Comment les ressources de diffusion en continu s'inscrivent-elles dans le paradigme RESTful?

5

En s'appuyant sur la suggestion de RestSharp de @ MutantNinjaCodeMonkey. Mon cas d'utilisation consistait à publier les données webform de la méthode $.ajax de jquery dans un contrôleur web api. Le service d'API reposant nécessitait que le fichier téléchargé soit ajouté au corps de la demande. La méthode restsharp par défaut de AddFile mentionnée ci-dessus a provoqué une erreur de The request was aborted: The request was canceled. L'initialisation suivante a fonctionné:

// Stream comes from web api's HttpPostedFile.InputStream 
     (HttpContext.Current.Request.Files["fileUploadNameFromAjaxData"].InputStream)
using (var ms = new MemoryStream())
{
    fileUploadStream.CopyTo(ms);
    photoBytes = ms.ToArray();
}

var request = new RestRequest(Method.PUT)
{
    AlwaysMultipartFormData = true,
    Files = { FileParameter.Create("file", photoBytes, "file") }
};
1
Ben Sewards
  1. Détecter le ou les fichiers en cours de transport avec la demande.
  2. Choisissez un chemin où le fichier sera chargé (et assurez-vous que CHMOD 777 existe pour ce répertoire)
  3. Accepter la connexion client
  4. Utiliser la bibliothèque prête pour le téléchargement réel

Passez en revue la discussion suivante: REST upload de fichier avec HttpRequestMessage ou Stream?

0
Daniel Golub

Vous pouvez l'envoyer sous forme de requête POST au serveur, en transmettant le fichier sous forme de FormParam.

    @POST
        @Path("/upload")
       //@Consumes(MediaType.MULTIPART_FORM_DATA)
        @Consumes("application/x-www-form-urlencoded")
        public Response uploadFile( @FormParam("uploadFile") String script,  @HeaderParam("X-Auth-Token") String STtoken, @Context HttpHeaders hh) {

            // local variables
            String uploadFilePath = null;
            InputStream fileInputStream = new ByteArrayInputStream(script.getBytes(StandardCharsets.UTF_8));

            //System.out.println(script); //debugging

            try {
                  uploadFilePath = writeToFileServer(fileInputStream, SCRIPT_FILENAME);
            }
            catch(IOException ioe){
               ioe.printStackTrace();
            }
            return Response.ok("File successfully uploaded at " + uploadFilePath + "\n").build();
        }

 private String writeToFileServer(InputStream inputStream, String fileName) throws IOException {

        OutputStream outputStream = null;
        String qualifiedUploadFilePath = SIMULATION_RESULTS_PATH + fileName;

        try {
            outputStream = new FileOutputStream(new File(qualifiedUploadFilePath));
            int read = 0;
            byte[] bytes = new byte[1024];
            while ((read = inputStream.read(bytes)) != -1) {
                outputStream.write(bytes, 0, read);
            }
            outputStream.flush();
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
        finally{
            //release resource, if any
            outputStream.close();
        }
        return qualifiedUploadFilePath;
    }
0
Erick