user3112567
user3112567

Reputation: 11

File Upload To Google Cloud Storage on Appengine(Python)

I have been trying to upload a file to google cloud storage from my google appengine application. but i keep getting this error message:

File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/cgi.py", line 540, in __getitem__
raise KeyError, key KeyError: 'files'

This is my client side upload form:

<form id="fileupload" action="/uploads" method="POST" enctype="multipart/form-data">
    <!-- Redirect browsers with JavaScript disabled to the origin page -->
    <noscript><input type="hidden" name="redirect" value="http://2479ja.tv/jqueryupload"></noscript>
    <!-- The fileupload-buttonbar contains buttons to add/delete files and start/cancel the upload -->
    <div class="row fileupload-buttonbar">
        <div class="col-lg-7">
            <!-- The fileinput-button span is used to style the file input field as button -->
            <span class="btn btn-success fileinput-button">
                <i class="glyphicon glyphicon-plus"></i>
                <span>Add files...</span>
                <input type="file" name="files" value="" required="required">
            </span>
            <button type="submit" class="btn btn-primary start">
                <i class="glyphicon glyphicon-upload"></i>
                <span>Start upload</span>
            </button>
            <button type="reset" class="btn btn-warning cancel">
                <i class="glyphicon glyphicon-ban-circle"></i>
                <span>Cancel upload</span>
            </button>
            <button type="button" class="btn btn-danger delete">
                <i class="glyphicon glyphicon-trash"></i>
                <span>Delete</span>
            </button>
            <input type="checkbox" class="toggle" value="">
            <!-- The global file processing state -->
            <span class="fileupload-process"></span>
        </div>
        <!-- The global progress state -->
        <div class="col-lg-5 fileupload-progress fade">
            <!-- The global progress bar -->
            <div class="progress progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100">
                <div class="progress-bar progress-bar-success" style="width:0%;"></div>
            </div>
            <!-- The extended global progress state -->
            <div class="progress-extended">&nbsp;</div>
        </div>
    </div>
    <!-- The table listing the files available for upload/download -->
    <table role="presentation" class="table table-striped"><tbody class="files"></tbody></table>
</form>**

This is my server side python script:

class UploadHandler2(webapp.RequestHandler):

  def PrintWithCarriageReturn(s):
     sys.stdout.write('\r' + s)
     sys.stdout.flush()
  def post(self):
 form = cgi.FieldStorage(keep_blank_values = 1)
     print form.keys()
     fileitem = form['files']
 if fileitem.filename:
       filename = os.path.basename(fileitem.filename)**

Can someone please advise what is wrong with this code? Thanks

Upvotes: 0

Views: 603

Answers (1)

Nick D
Nick D

Reputation: 71

You're using webapp to handle your requests, it looks like your cgi.FieldStorage isn't receiving the data, so there is no 'files' in your form object, hence the KeyError.

For webapp, you can just do:

def post(self):
    fileitem = self.request.POST.get('files', None)

    fileblob = fileitem.file.read()
    filename = fileitem.filename
    mimetype = fileitem.type

(With the appropriate error checks for None, of course).

Upvotes: 1

Related Questions