3

私は私のファイルのアップロードを可能にする、次のWebサービスを持っている:それは私のWindowsフォームから呼び出されたときには、Webサービスを呼び出すことによって、JavaScriptからファイルをアップロードする

[WebService(Namespace = "http://tempuri.org/")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    [System.ComponentModel.ToolboxItem(false)] 
    // Pour autoriser l'appel de ce service Web depuis un script à l'aide d'ASP.NET AJAX, supprimez les marques de commentaire de la ligne suivante. 
    [System.Web.Script.Services.ScriptService] 
    public class Upload : System.Web.Services.WebService 
    { 
     [WebMethod] 
     public bool UploadFile(string PictureName, byte[] PictureStream) 
     { 
      FileStream fileStream = null; 
      BinaryWriter writer = null; 
      string filePath; 

      try 
      { 
       filePath = HttpContext.Current.Server.MapPath(".") + ConfigurationManager.AppSettings["PictureUploadDirectory"] + PictureName; 

       if (PictureName != string.Empty) 
       { 
        fileStream = File.Open(filePath, FileMode.Create); 
        writer = new BinaryWriter(fileStream); 
        writer.Write(PictureStream); 
       } 

       return true; 
      } 
      catch (Exception) 
      { 
       return false; 
      } 
      finally 
      { 
       if (fileStream != null) 
        fileStream.Close(); 
       if (writer != null) 
        writer.Close(); 
      } 
     } 
    } 

それは素晴らしい作品。

今、HTML/JavaScriptで動作させようとしています。 index.htmlファイルには、(クロスドメインエラーを回避するために)サーバ側に置くと、次のコードが含まれている:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <title></title> 
     <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.8/themes/base/jquery-ui.css" type="text/css" media="all" /> 
     <link rel="stylesheet" href="http://static.jquery.com/ui/css/demo-docs-theme/ui.theme.css" type="text/css" media="all" /> 
     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"></script> 
     <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.8/jquery-ui.min.js" type="text/javascript"></script> 
     <script type="text/javascript"> 
      $(document).ready(function() { 
       $("#btnSend").click(function() { 
        var fileStream = $("#fileToSend").val(); 
        $.ajax({ 
         type: "POST", 
         data: { PictureName: 'foobar', PictureStream: fileStream }, 
         dataType: "image/gif", 
         url: "http://localhost/WebServices/Upload.asmx/UploadFile", 
         contentType: "application/x-www-form-urlencoded", 
         success: function() { 
          alert('yes'); 
         }, 
         error: function() { 
          alert('bouh'); 
         } 
        }); 
       }); 
      }); 
     </script> 
    </head> 
    <body> 
     <input type="file" id="fileToSend"/> 
     <br /> 
     <input type="button" value="Envoyer" id="btnSend"/> 
    </body> 
</html> 

私は、ファイルをアップロードしようとすると、私のサーバーから次の応答を取得:

System.ArgumentException: Unable to convert C:\fakepath\logo.gif into System.Byte. 

このエラーを回避するにはどうすればよいですか?

ありがとうございます。

答えて

1

Ajaxでファイルをアップロードすることはできません。似たような効果をシミュレートするiframeを使うことはできますが、フォームを嫌う必要があります。

+0

Thans。アイデアを示すコードがありますか? – Zakaria

+0

[こちらは素晴らしい例です](http://www.ajaxf1.com/tutorial/ajax-file-upload-tutorial.html) –

0

$("form").submit();または送信ボタンをクリックして)私はこの例がお手伝いします場合は知らないが、私はそれはこのようにjQueryの1.4で作業しました:あなたの答えのための

//JAVASCRIPT 

    var objFile = $jQuery("#fileToUpload"); 
    var file = objFile[0].files[0]; 
    API.call({ 
     url : "rest-url/upload", 
     type : "POST", 
     contentType : "multipart/form-data", 
     data: file, 
     processData: false 
    }); 

//JAVA 

@POST 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
@Produces(MediaType.APPLICATION_JSON) 
@Path("rest-url/upload") 
public Response upload(InputStream fileInputStream) throws Exception { 
    //here you got your file 
    return Response.ok().entity(new Object("response")).build(); 
} 
関連する問題