我正在通过HTML表单将文件发布到WCF REST服务,enctype设置为multipart/form-data和单个组件:<input type="file" name="data">.由服务器读取的结果流包含以下内容:
------WebKitFormBoundary
Content-Disposition: form-data; name="data"; filename="DSCF0001.JPG"
Content-Type: image/jpeg
<file bytes>
------WebKitFormBoundary--
Run Code Online (Sandbox Code Playgroud)
问题是我不确定如何从流中提取文件字节.我需要这样做才能将文件写入磁盘.
我正在尝试通过multipart/form-data帖子上传图片,我正在使用下面的代码.我只会上传.jpg图片.
问题是保存的图像不是有效图像,无法查看.它也比我上传的文件大200个字节,所以我想我在这里遗漏了什么?
public class FileUploadController : ApiController
{
public Task<HttpResponseMessage> PostUploadFile()
{
return UploadFileAsync().ContinueWith<HttpResponseMessage>((tsk) =>
{
HttpResponseMessage response = null;
if (tsk.IsCompleted)
{
response = new HttpResponseMessage(HttpStatusCode.Created);
}
else if (tsk.IsFaulted || tsk.IsCanceled)
{
response =
new HttpResponseMessage(HttpStatusCode.InternalServerError);
}
return response;
});
}
public Task UploadFileAsync()
{
return this.Request.Content.ReadAsStreamAsync().ContinueWith((tsk) =>
{ SaveToFile(tsk.Result); },
TaskContinuationOptions.OnlyOnRanToCompletion);
}
private void SaveToFile(Stream requestStream)
{
string path =
System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory);
using (FileStream targetStream =
File.Create(path + "/Uploads/" + DateTime.Now.ToFileTime() + ".jpg"))
{ …Run Code Online (Sandbox Code Playgroud) 我们需要通过将数据附加在 javascript 中的 formdata 中来将数据发送到服务器。在 javascript 中,我们像下面这样处理这个。
var ajax = new XMLHttpRequest();
ajax.open("POST", url, true);
var formData = new FormData();
var obj = {url: "uploadUrl",type: 'POST', mode: true};
formData.append('myData', JSON.stringify(obj));
ajax.send(formData);
Run Code Online (Sandbox Code Playgroud)
在服务器端,我们有如下方法。
public void Save(MyModel args) {
....
}
public class MyModel
{
public MyObj myData { get; set; }
}
public class MyObj
{
public string url { get; set; }
public string type { get; set; }
public bool mode { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
args.myData 始终接收为空值。这里如何接收客户端发送的这种格式的数据?提出你的想法。
该系统是与WCF REST Web服务通信的Flex应用程序.我正在尝试将文件从Flex应用程序上传到服务器并遇到一些问题,我希望有人可以帮忙.我在Flex应用程序中使用FileReference来浏览和上传此处定义的文件:
http://blog.flexexamples.com/2007/09/21/uploading-files-in-flex-using-the-filereference-class/
然后,我在WCF REST Web服务中使用流(在调试器中显示为System.ServiceModel.Dispatcher.StreamFormatter.MessageBodyStream)接收文件(使用WCF 4 REST服务的项目类型)
[WebInvoke(Method = "POST", UriTemplate = "_test/upload")]
public void UploadImage(Stream data)
{
// TODO: just hardcode filename for now
var filepath = HttpContext.Current.Server.MapPath(@"~\_test\testfile.txt");
using (Stream file = File.OpenWrite(filepath))
{
CopyStream(data, file);
}
}
private static void CopyStream(Stream input, Stream output)
{
var buffer = new byte[8 * 1024];
int len;
while ((len = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, len);
}
}
Run Code Online (Sandbox Code Playgroud)
注意:此帖子中使用的CopyStream方法:如何将流保存到C#中的文件?
该文件保存没有任何问题.我遇到的问题是该文件包含的信息比我想要的多.以下是保存文件的内容(源文件仅包含"这是文件的内容"):
------------ae0ae0Ef1ae0Ef1ae0gL6gL6Ij5cH2
Content-Disposition: form-data; name="Filename"
testfile.txt …Run Code Online (Sandbox Code Playgroud) c# ×4
wcf ×2
apache-flex ×1
form-data ×1
forms ×1
http-post ×1
javascript ×1
post ×1
rest ×1
stream ×1