C# 上传文件到 Java(struts2)端示例

来源:互联网 发布:淘宝广场舞服装春装 编辑:程序博客网 时间:2024/05/22 02:06

C#通过Http协议上传文件的示例比较多,在此贴一个,也是从网上查的,当时查到了好几个版本,应该都可以用,我的当时Java端用的apache的common upload,但是从Request中解析不到文件内容,因为是拷贝之前的代码,没有问题,所以误认为是C#端的问题,换了几种方式都不行,最后发现是因为struts2对Request进行处理后,在用common upload解析就得不到想要的内容了。

C#上传文件:

public static string HttpUploadFile(string url, string[] files, NameValueCollection data, Encoding encoding)        {            string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");            byte[] boundarybytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");            byte[] endbytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");            //1.HttpWebRequest            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);            request.ContentType = "multipart/form-data; boundary=" + boundary;            request.Method = "POST";            request.KeepAlive = true;            request.Credentials = CredentialCache.DefaultCredentials;            using (Stream stream = request.GetRequestStream())            {                //1.1 key/value                string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";                if (data != null)                {                    foreach (string key in data.Keys)                    {                        stream.Write(boundarybytes, 0, boundarybytes.Length);                        string formitem = string.Format(formdataTemplate, key, data[key]);                        byte[] formitembytes = encoding.GetBytes(formitem);                        stream.Write(formitembytes, 0, formitembytes.Length);                    }                }                //1.2 file                string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: application/octet-stream\r\n\r\n";                byte[] buffer = new byte[4096];                int bytesRead = 0;                for (int i = 0; i < files.Length; i++)                {                    stream.Write(boundarybytes, 0, boundarybytes.Length);                    string header = string.Format(headerTemplate, "file" + i, Path.GetFileName(files[i]));                    byte[] headerbytes = encoding.GetBytes(header);                    stream.Write(headerbytes, 0, headerbytes.Length);                    using (FileStream fileStream = new FileStream(files[i], FileMode.Open, FileAccess.Read))                    {                        while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)                        {                            stream.Write(buffer, 0, bytesRead);                        }                    }                }                //1.3 form end                stream.Write(endbytes, 0, endbytes.Length);            }            //2.WebResponse            HttpWebResponse response = (HttpWebResponse)request.GetResponse();            using (StreamReader stream = new StreamReader(response.GetResponseStream()))            {                return stream.ReadToEnd();            }        }

Java端处理:

因为Struts2会解析一次Request,所以在上传文件的方法中为了让common upload起作用,就不能使用struts2的解析器,需要跳过它,方法是在struts.xml配置文件中配置如下代码:

<constant name="struts.multipart.handler" value="myRequestParser" /><!--指定自己的实现类--><bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="myRequestParser" class="com.**.MyRequestParser"  scope="default" optional="true" />
自己的实现类,空的就行:

import java.io.IOException;import org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest;import javax.servlet.http.HttpServletRequest;public class MyRequestParser extends JakartaMultiPartRequest{public void parse(HttpServletRequest servletRequest, String saveDir)throws IOException{}}




原创粉丝点击