java - 从 Java 到 Python webapp2 的 HTTPPost 多部分(上传文件)

标签 java android python google-app-engine flask

我正在尝试将文件上传到 GAE - 服务器端代码:

 class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
    def post(self):
            upload_files = self.get_uploads('file')  
            blob_info = upload_files[0] # When using flask, request.files[0] gives correct output.
            self.response.out.write('/serve/%s' % blob_info.key())

使用 HTML,我可以让它工作:

upload_url = blobstore.create_upload_url('/upload')
    self.response.out.write('<html><body>')
    self.response.out.write('<form action="%s" method="POST" enctype="multipart/form-data">' % upload_url)
    self.response.out.write("""Upload File: <input type="file" name="file"><br> <input type="submit"
        name="submit" value="Submit"> </form></body></html>""")

但我必须能够从 Java 执行多部分发布请求。我有一个 flask 项目托管在 openshift (flask,request.files[0] 而不是),其中 Java 代码似乎可以工作:

HttpParams params = new BasicHttpParams();
params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
DefaultHttpClient mHttpClient = new DefaultHttpClient(params);
HttpPost httppost = new HttpPost(getString(R.string.url_webservice) + "/upload");
MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
multipartEntity.addPart("file", new FileBody(new File(path)));
httppost.setEntity(multipartEntity);
mHttpClient.execute(httppost, new MyUploadResponseHandler(path));

但是当我在 GAE 上运行它时,我在上传时得到 upload_files[0] 上的索引越界 - 错误在哪里?我似乎找不到它,代码与我确认可以工作的以下内容非常相似(flask, openshift):

def upload_file():
if request.method == 'POST':
    file = request.files['file']
    ...

更新:完整的错误日志:

list index out of range
Traceback (most recent call last):
  File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line  1511, in __call__
    rv = self.handle_exception(request, response, e)
  File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1505, in __call__
   rv = self.router.dispatch(request, response)
   File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1253, in default_dispatcher
return route.handler_adapter(request, response)
   File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1077, in __call__
return handler.dispatch()
   File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 547, in dispatch
return self.handle_exception(e, self.app.debug)
   File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 545, in dispatch
return method(*args, **kwargs)
   File "myapp.py", line 22, in post
blob_info = upload_files[0]
 IndexError: list index out of range

最佳答案

blobstore.create_upload_url('/upload') 不生成 url /upload 但是在 java 中,/upload 是您要发布到的位置 查看从该处理程序生成的 html,您会看到表单的操作 url 是不同的。

您可以让处理程序使用您的 Java 代码获取然后用于发布的上传 URL 进行响应。

关于java - 从 Java 到 Python webapp2 的 HTTPPost 多部分(上传文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12014609/

相关文章:

python - 使用 Python 从 IBM Watson Concept Insights 调用 annotate_text

python - 在 Python 中为 ansible callback_plugin 合并两个 json 字符串的更好方法

Python Matplotlib 直方图颜色

android: NotificationManager 无法解析为变量

java - camera.setPreviewCallback 旋转图像

java - JPA Repository.findById() 返回 null 但该值存在于数据库中

java - 使用 GWT 更改 RichtextToolbar.java

java - 通知传输控件似乎没有执行任何操作

java - 如何在 java 中使用 bouncy caSTLe 以 ASN1 格式导出 X509Certificate?

android - Kotlin和Unity开发错误