2010-10-05 28 views
10

Estoy intentando subir imágenes a ImageShack con la API. Creo que requieren que el formulario sea multipart/form-data. He intentado hacer el siguiente ...Cómo cambiar el encabezado en 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); 

pero tengo

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: 

¿Cuál es incorrecto o cómo puedo cambiar los encabezados en el cliente Web, entonces?

+0

Esto es más de cabeceras. Esto significa empaquetar el cuerpo de una manera muy específica que UploadValues ​​no puede procesar. Es posible que deba transformarlo y enviar el cuerpo 'byte []' manualmente. Que es difícil. O obtenga un componente para hacerlo por usted. O pregunta si puedes enviar el cuerpo del archivo como la carga útil. –

Respuesta

17

Parece que no puede establecer Content-type con el método WebClient.UploadValues. También podemos establecer el tipo de contenido con el método WebClient.UploadData

usar algo como,

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

Muchas gracias por esto, estaba usando UploadString sin dados. No puedo creer los documentos; ¡Si quisiera dedicar tiempo a prueba y error o consultar a otros, seré un programador de Unix! –

+0

@GerardONeill - Pude llamar 'Client.Headers.Add (HttpRequestHeader.ContentType," appliction/json ") usando' UploadString (string, string) 'y enviando los datos como el segundo parámetro - Creo que el problema es con 'UploadValues' como en tu pregunta. –

+3

3 años después y esta fue una respuesta muy útil, +1 hijo. – Smoore

0

del documentation, WebException se inicia cuando:

La cabecera Content-type no es una referencia nula (Nothing en Visual Basic) o "application/x-www-form-urlencoded".

+0

Vi eso pero estoy usando "multipart/form-data"? ... oh NO es icónico, pero ¿cómo puedo cambiar el tipo de contenido? –

+0

No se parece a ti. De la documentación, parece que "application/x-www-form-urlencoded" es el único valor aceptable. –