2010-10-05 42 views
10

Tôi đang cố gắng tải hình ảnh lên ImageShack bằng API. Tôi nghĩ rằng họ yêu cầu hình thức là multipart/form-data. Tôi cố gắng để làm dưới đây ...Cách thay đổi Tiêu đề trong WebClient

var wc = new WebClient(); 
wc.Headers.Add("Content-Type", "multipart/form-data"); 
... 
var fs = new FileStream(@"filepath", FileMode.Open, FileAccess.Read); 
byte[] bytes = new byte[fs.Length]; 
fs.Read(bytes, 0, Convert.ToInt32(fs.Length)); 
string encoded = Convert.ToBase64String(bytes); 
data.Add("fileupload", encoded); 
... 
byte[] output = wc.UploadValues("http://www.imageshack.us/upload_api.php ", "POST", data); 

nhưng có

System.Net.WebException was unhandled 
    Message=The Content-Type header cannot be changed from its default value for this request. 
    Source=System 
    StackTrace: 
     at System.Net.WebClient.UploadValues(Uri address, String method, NameValueCollection data) 
     at System.Net.WebClient.UploadValues(String address, String method, NameValueCollection data) 
     at WpfApplication1.ViewModels.ShellViewModel.Upload() in D:\tmp\WpfApplication1\WpfApplication1\ViewModels\ShellViewModel.cs:line 61 
     at WpfApplication1.ViewModels.ShellViewModel.<.ctor>b__1() in D:\tmp\WpfApplication1\WpfApplication1\ViewModels\ShellViewModel.cs:line 18 
     at MvvmFoundation.Wpf.RelayCommand.Execute(Object parameter) 
     at MS.Internal.Commands.CommandHelpers.CriticalExecuteCommandSource(ICommandSource commandSource, Boolean userInitiated) 
     at System.Windows.Controls.Primitives.ButtonBase.OnClick() 
     at System.Windows.Controls.Button.OnClick() 
     at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e) 
     at System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e) 
     at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget) 
     at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) 
     at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) 
     at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) 
     at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent) 
     at System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e) 
     at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget) 
     at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) 
     at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) 
     at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) 
     at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) 
     at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args) 
     at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted) 
     at System.Windows.Input.InputManager.ProcessStagingArea() 
     at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input) 
     at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport) 
     at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel) 
     at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
     at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
     at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
     at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 
     at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
     at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 
     at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) 
     at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 
     at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) 
     at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 
     at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame) 
     at System.Windows.Threading.Dispatcher.Run() 
     at System.Windows.Application.RunDispatcher(Object ignore) 
     at System.Windows.Application.RunInternal(Window window) 
     at System.Windows.Application.Run(Window window) 
     at System.Windows.Application.Run() 
     at WpfApplication1.App.Main() in D:\tmp\WpfApplication1\WpfApplication1\obj\x86\Debug\App.g.cs:line 0 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 

Whats sai hoặc làm thế nào tôi có thể thay đổi tiêu đề trong WebClient sau đó?

+0

Đây là hơn tiêu đề. Điều này có nghĩa là đóng gói cơ thể theo một cách rất cụ thể mà UploadValues ​​không thể xử lý. Bạn có thể cần phải chuyển đổi nó và gửi cơ thể 'byte []' theo cách thủ công. Đó là khó khăn. Hoặc có được một thành phần để làm điều đó cho bạn. Hoặc hỏi xem bạn có thể chỉ gửi nội dung tệp làm trọng tải không. –

Trả lời

17

Có vẻ như bạn không thể đặt Loại nội dung bằng phương pháp WebClient.UploadValues. Bạn có thể thiết lập Content-type với phương pháp WebClient.UploadData

Sử dụng một cái gì đó như thế nào,

Client.Headers["Content-Type"] = "application/json"; 
Client.UploadData("http://www.imageshack.us/upload_api.php", "POST", Encoding.Default.GetBytes("{\"Data\": \"Test\"}")); 
+0

Cảm ơn bạn rất nhiều vì điều này - Tôi đã sử dụng UploadString mà không có súc sắc. Tôi không thể tin được tài liệu; Nếu tôi muốn dành thời gian làm thử và sai hoặc tư vấn cho người khác, tôi sẽ là một lập trình viên Unix! –

+0

@GerardONeill - Tôi đã có thể gọi 'Client.Headers.Add (HttpRequestHeader.ContentType," appliction/json ") bằng cách sử dụng' UploadString (chuỗi, chuỗi) 'và gửi dữ liệu làm tham số thứ hai - tôi nghĩ vấn đề là 'UploadValues' như trong câu hỏi của bạn. –

+3

3 năm sau và điều này vẫn là một câu trả lời hữu ích điên rồ, 1 con trai. – Smoore

0

từ documentation, WebException được ném khi:

Phần header Content-type không phải là một tham chiếu null (Không có gì trong Visual Basic) hoặc "application/x-www-form-urlencoded".

+0

Tôi thấy điều đó nhưng tôi đang sử dụng "multipart/form-data"? ... oh là KHÔNG icic, nhưng làm thế nào tôi có thể thay đổi loại nội dung sau đó? –

+0

Không giống như bạn có thể. Từ tài liệu, có vẻ như "application/x-www-form-urlencoded" là giá trị chỉ chấp nhận được. –

Các vấn đề liên quan