3

我有以下的Web服务,可以让我上传文件:通过调用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(); 
      } 
     } 
    } 

当它从我的Windows窗体调用它的伟大工程。

现在,我试图使它与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,但您仍然需要使用该表单。 (由$("form").submit();或点击提交按钮)

+0

Thans你的答案。你有一段代码能够说明你的想法吗? – Zakaria 2011-02-07 15:15:18

0

我不知道这是否例子可以帮助你,但我得到了它使用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(); 
}